summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2014-02-20 06:51:07 +0000
committerRui Ueyama <ruiu@google.com>2014-02-20 06:51:07 +0000
commit6fac32b176b4205167075d11fcba93c68aac5e38 (patch)
treeb4f257f0a8bc73c1bd328e5ba796851778521965
parentccb98645b6bb25c3216043d3817ce1b860d37a34 (diff)
downloadllvm-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.h1
-rw-r--r--lib/Object/COFFObjectFile.cpp12
-rw-r--r--test/tools/llvm-objdump/coff-private-headers.test1
-rw-r--r--tools/llvm-objdump/COFFDump.cpp22
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