aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Object/COFFObjectFile.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-11-05 06:24:35 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-11-05 06:24:35 +0000
commit5026722287502bdc8784e860137d1b75b0bf48be (patch)
tree2a51f223685e916391358777e6584144fc00c331 /llvm/lib/Object/COFFObjectFile.cpp
parentee5e690c0a90419f50604ff279b9b5a4e7c277da (diff)
downloadllvm-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.cpp26
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;