Skip to content

Commit

Permalink
llvm-objdump/COFF: Print SEH table addresses.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
rui314 committed Feb 20, 2014
1 parent ccb9864 commit 6fac32b
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 3 deletions.
1 change: 1 addition & 0 deletions include/llvm/Object/COFF.h
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,7 @@ class COFFObjectFile : public ObjectFile {
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;

Expand Down
12 changes: 9 additions & 3 deletions lib/Object/COFFObjectFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
1 change: 1 addition & 0 deletions test/tools/llvm-objdump/coff-private-headers.test
Original file line number Diff line number Diff line change
Expand Up @@ -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
22 changes: 22 additions & 0 deletions tools/llvm-objdump/COFFDump.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
Expand All @@ -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);

Expand All @@ -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
Expand Down

0 comments on commit 6fac32b

Please sign in to comment.