diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-11-05 06:24:35 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-11-05 06:24:35 +0000 |
commit | 5026722287502bdc8784e860137d1b75b0bf48be (patch) | |
tree | 2a51f223685e916391358777e6584144fc00c331 /llvm/lib/Object/COFFObjectFile.cpp | |
parent | ee5e690c0a90419f50604ff279b9b5a4e7c277da (diff) | |
download | llvm-5026722287502bdc8784e860137d1b75b0bf48be.zip llvm-5026722287502bdc8784e860137d1b75b0bf48be.tar.gz llvm-5026722287502bdc8784e860137d1b75b0bf48be.tar.bz2 |
llvm-readobj: Add support for dumping the DOS header in PE files
llvm-svn: 221333
Diffstat (limited to 'llvm/lib/Object/COFFObjectFile.cpp')
-rw-r--r-- | llvm/lib/Object/COFFObjectFile.cpp | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/llvm/lib/Object/COFFObjectFile.cpp b/llvm/lib/Object/COFFObjectFile.cpp index a8ae5f1..4fbb782 100644 --- a/llvm/lib/Object/COFFObjectFile.cpp +++ b/llvm/lib/Object/COFFObjectFile.cpp @@ -572,20 +572,20 @@ COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC) bool HasPEHeader = false; // Check if this is a PE/COFF file. - if (base()[0] == 0x4d && base()[1] == 0x5a) { + if (checkSize(Data, EC, sizeof(dos_header) + sizeof(COFF::PEMagic))) { // PE/COFF, seek through MS-DOS compatibility stub and 4-byte // PE signature to find 'normal' COFF header. - if (!checkSize(Data, EC, 0x3c + 8)) - return; - CurPtr = *reinterpret_cast<const ulittle16_t *>(base() + 0x3c); - // Check the PE magic bytes. ("PE\0\0") - if (std::memcmp(base() + CurPtr, COFF::PEMagic, sizeof(COFF::PEMagic)) != - 0) { - EC = object_error::parse_failed; - return; + const auto *DH = reinterpret_cast<const dos_header *>(base()); + if (DH->Magic[0] == 'M' && DH->Magic[1] == 'Z') { + CurPtr = DH->AddressOfNewExeHeader; + // Check the PE magic bytes. ("PE\0\0") + if (memcmp(base() + CurPtr, COFF::PEMagic, sizeof(COFF::PEMagic)) != 0) { + EC = object_error::parse_failed; + return; + } + CurPtr += sizeof(COFF::PEMagic); // Skip the PE magic bytes. + HasPEHeader = true; } - CurPtr += sizeof(COFF::PEMagic); // Skip the PE magic bytes. - HasPEHeader = true; } if ((EC = getObject(COFFHeader, Data, base() + CurPtr))) @@ -627,11 +627,11 @@ COFFObjectFile::COFFObjectFile(MemoryBufferRef Object, std::error_code &EC) const uint8_t *DataDirAddr; uint64_t DataDirSize; - if (Header->Magic == 0x10b) { + if (Header->Magic == COFF::PE32Header::PE32) { PE32Header = Header; DataDirAddr = base() + CurPtr + sizeof(pe32_header); DataDirSize = sizeof(data_directory) * PE32Header->NumberOfRvaAndSize; - } else if (Header->Magic == 0x20b) { + } else if (Header->Magic == COFF::PE32Header::PE32_PLUS) { PE32PlusHeader = reinterpret_cast<const pe32plus_header *>(Header); DataDirAddr = base() + CurPtr + sizeof(pe32plus_header); DataDirSize = sizeof(data_directory) * PE32PlusHeader->NumberOfRvaAndSize; |