diff options
author | Rui Ueyama <ruiu@google.com> | 2014-02-20 06:51:07 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2014-02-20 06:51:07 +0000 |
commit | 6fac32b176b4205167075d11fcba93c68aac5e38 (patch) | |
tree | b4f257f0a8bc73c1bd328e5ba796851778521965 | |
parent | ccb98645b6bb25c3216043d3817ce1b860d37a34 (diff) | |
download | llvm-6fac32b176b4205167075d11fcba93c68aac5e38.tar.gz llvm-6fac32b176b4205167075d11fcba93c68aac5e38.tar.bz2 llvm-6fac32b176b4205167075d11fcba93c68aac5e38.tar.xz |
llvm-objdump/COFF: Print SEH table addresses.
SEH table addresses are VA in COFF file. In this patch we convert VA to RVA
before printing it, because dumpbin prints them as RVAs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201760 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Object/COFF.h | 1 | ||||
-rw-r--r-- | lib/Object/COFFObjectFile.cpp | 12 | ||||
-rw-r--r-- | test/tools/llvm-objdump/coff-private-headers.test | 1 | ||||
-rw-r--r-- | tools/llvm-objdump/COFFDump.cpp | 22 |
4 files changed, 33 insertions, 3 deletions
diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index a7a112a864..dd36067485 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -397,6 +397,7 @@ public: error_code getSectionContents(const coff_section *Sec, ArrayRef<uint8_t> &Res) const; + error_code getVaPtr(uint32_t Rva, uintptr_t &Res) const; error_code getRvaPtr(uint32_t Rva, uintptr_t &Res) const; error_code getHintName(uint32_t Rva, uint16_t &Hint, StringRef &Name) const; diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index a1bbc56d2b..85b2f0b91d 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -381,15 +381,21 @@ error_code COFFObjectFile::initSymbolTablePtr() { return object_error::success; } +// Returns the file offset for the given VA. +error_code COFFObjectFile::getVaPtr(uint32_t Addr, uintptr_t &Res) const { + uint32_t ImageBase = PE32Header ? PE32Header->ImageBase : PE32PlusHeader->ImageBase; + return getRvaPtr(Addr - ImageBase, Res); +} + // Returns the file offset for the given RVA. -error_code COFFObjectFile::getRvaPtr(uint32_t Rva, uintptr_t &Res) const { +error_code COFFObjectFile::getRvaPtr(uint32_t Addr, uintptr_t &Res) const { for (section_iterator I = section_begin(), E = section_end(); I != E; ++I) { const coff_section *Section = getCOFFSection(I); uint32_t SectionStart = Section->VirtualAddress; uint32_t SectionEnd = Section->VirtualAddress + Section->VirtualSize; - if (SectionStart <= Rva && Rva < SectionEnd) { - uint32_t Offset = Rva - SectionStart; + if (SectionStart <= Addr && Addr < SectionEnd) { + uint32_t Offset = Addr - SectionStart; Res = uintptr_t(base()) + Section->PointerToRawData + Offset; return object_error::success; } diff --git a/test/tools/llvm-objdump/coff-private-headers.test b/test/tools/llvm-objdump/coff-private-headers.test index cd186a44b5..51bf443538 100644 --- a/test/tools/llvm-objdump/coff-private-headers.test +++ b/test/tools/llvm-objdump/coff-private-headers.test @@ -64,3 +64,4 @@ LOADCFG-NEXT: CSD Version: 0 LOADCFG-NEXT: Security Cookie: 4206616 LOADCFG-NEXT: SEH Table: 4202768 LOADCFG-NEXT: SEH Count: 1 +LOADCFG: SEH Table: 0x401689 diff --git a/tools/llvm-objdump/COFFDump.cpp b/tools/llvm-objdump/COFFDump.cpp index 883786d4f6..91ca5ba7e2 100644 --- a/tools/llvm-objdump/COFFDump.cpp +++ b/tools/llvm-objdump/COFFDump.cpp @@ -233,6 +233,25 @@ static void printCOFFSymbolAddress(llvm::raw_ostream &Out, Out << format(" + 0x%04x", Disp); } +static void +printSEHTable(const COFFObjectFile *Obj, uint32_t TableVA, int Count) { + if (Count == 0) + return; + + const pe32_header *PE32Header; + if (error(Obj->getPE32Header(PE32Header))) + return; + uint32_t ImageBase = PE32Header->ImageBase; + uintptr_t IntPtr = 0; + if (error(Obj->getVaPtr(TableVA, IntPtr))) + return; + const support::ulittle32_t *P = (const support::ulittle32_t *)IntPtr; + outs() << "SEH Table:"; + for (int I = 0; I < Count; ++I) + outs() << format(" 0x%x", P[I] + ImageBase); + outs() << "\n\n"; +} + static void printLoadConfiguration(const COFFObjectFile *Obj) { const coff_file_header *Header; if (error(Obj->getCOFFHeader(Header))) @@ -249,6 +268,7 @@ static void printLoadConfiguration(const COFFObjectFile *Obj) { return; if (error(Obj->getRvaPtr(DataDir->RelativeVirtualAddress, IntPtr))) return; + const coff_load_configuration32 *LoadConf = reinterpret_cast<const coff_load_configuration32 *>(IntPtr); @@ -271,6 +291,8 @@ static void printLoadConfiguration(const COFFObjectFile *Obj) { << "\n SEH Table: " << LoadConf->SEHandlerTable << "\n SEH Count: " << LoadConf->SEHandlerCount << "\n\n"; + printSEHTable(Obj, LoadConf->SEHandlerTable, LoadConf->SEHandlerCount); + outs() << "\n"; } // Prints import tables. The import table is a table containing the list of |