diff options
author | Eric Christopher <echristo@apple.com> | 2011-04-03 22:53:19 +0000 |
---|---|---|
committer | Eric Christopher <echristo@apple.com> | 2011-04-03 22:53:19 +0000 |
commit | 539d8d8a72995d08afe7b986fe98a1dc7fec4b0a (patch) | |
tree | e2a279ac67ecb0a4297e67753e0a608a73ae1af0 /lib/Support | |
parent | e243fd9e2be8897c9350650b724d7eda2f607f8f (diff) | |
download | external_llvm-539d8d8a72995d08afe7b986fe98a1dc7fec4b0a.zip external_llvm-539d8d8a72995d08afe7b986fe98a1dc7fec4b0a.tar.gz external_llvm-539d8d8a72995d08afe7b986fe98a1dc7fec4b0a.tar.bz2 |
Assorted bugfixes in object file handling:
- Adds support for sniffing PE/COFF files on win32 (.exe and .dll)
which are COFF files that have an MS-DOS compatibility stub on
the front of them.
- Fixes a bug in the COFFObjectFile's support for the Microsoft COFF
extension for long symbol names, wherein it was attempting to parse
the leading '/' in an extended symbol name reference as part of the
integer offset.
- Fixes bugs in COFFObjectFile and ELFObjectFile wherein section
and symbol iterators were being returned with uninitialized bytes;
the type DataRefImpl is a union between 2 32-bit words (d.a and d.b)
and a single intptr_t word (p). Only p was being initialized, so in
32-bit builds the result would be iterators with random upper 32-bit
words in their DataRefImpls. This caused random failures when
seeking around in object files.
Patch by Graydon Hoare!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128799 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support')
-rw-r--r-- | lib/Support/Path.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/lib/Support/Path.cpp b/lib/Support/Path.cpp index e5e875b..cfe23d8 100644 --- a/lib/Support/Path.cpp +++ b/lib/Support/Path.cpp @@ -15,11 +15,15 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Config/config.h" #include "llvm/Support/FileSystem.h" +#include "llvm/Support/Endian.h" #include <cassert> #include <cstring> #include <ostream> using namespace llvm; using namespace sys; +namespace { +using support::ulittle32_t; +} //===----------------------------------------------------------------------===// //=== WARNING: Implementation here must contain only TRULY operating system @@ -129,6 +133,16 @@ sys::IdentifyFileType(const char *magic, unsigned length) { if (magic[1] == 0x02) return COFF_FileType; break; + + case 0x4d: // Possible MS-DOS stub on Windows PE file + if (magic[1] == 0x5a) { + uint32_t off = *reinterpret_cast<const ulittle32_t *>(magic + 0x3c); + // PE/COFF file, either EXE or DLL. + if (off < length && memcmp(magic + off, "PE\0\0",4) == 0) + return COFF_FileType; + } + break; + case 0x64: // x86-64 Windows. if (magic[1] == char(0x86)) return COFF_FileType; |