mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-20 10:24:12 +00:00
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
This commit is contained in:
@ -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;
|
||||
|
Reference in New Issue
Block a user