[llvm] r201760 - llvm-objdump/COFF: Print SEH table addresses.

Rui Ueyama ruiu at google.com
Thu Feb 20 10:49:32 PST 2014


Hi Nakamura-san,

Thank you for doing this. I think it's safe to truncate uint64_t to 32 here
because this path is used only when the file being read is x86 executable.
PE32Header should never be nullptr. I'll add an assert there.


On Thu, Feb 20, 2014 at 2:27 AM, NAKAMURA Takumi <geek4civic at gmail.com>wrote:

> Ueyama san,
>
> Tweaked in r201769 to appease msvc.
> I wonder if I could truncate i64 here...
>
> ...Takumi
>
> 2014-02-20 15:51 GMT+09:00 Rui Ueyama <ruiu at google.com>:
> > Author: ruiu
> > Date: Thu Feb 20 00:51:07 2014
> > New Revision: 201760
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=201760&view=rev
> > Log:
> > 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.
> >
> > Modified:
> >     llvm/trunk/include/llvm/Object/COFF.h
> >     llvm/trunk/lib/Object/COFFObjectFile.cpp
> >     llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test
> >     llvm/trunk/tools/llvm-objdump/COFFDump.cpp
> >
> > Modified: llvm/trunk/include/llvm/Object/COFF.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFF.h?rev=201760&r1=201759&r2=201760&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/Object/COFF.h (original)
> > +++ llvm/trunk/include/llvm/Object/COFF.h Thu Feb 20 00:51:07 2014
> > @@ -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;
> >
> >
> > Modified: llvm/trunk/lib/Object/COFFObjectFile.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=201760&r1=201759&r2=201760&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
> > +++ llvm/trunk/lib/Object/COFFObjectFile.cpp Thu Feb 20 00:51:07 2014
> > @@ -381,15 +381,21 @@ error_code COFFObjectFile::initSymbolTab
> >    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;
> >      }
> >
> > Modified: llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test?rev=201760&r1=201759&r2=201760&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test
> (original)
> > +++ llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test Thu Feb
> 20 00:51:07 2014
> > @@ -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
> >
> > Modified: llvm/trunk/tools/llvm-objdump/COFFDump.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/COFFDump.cpp?rev=201760&r1=201759&r2=201760&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/tools/llvm-objdump/COFFDump.cpp (original)
> > +++ llvm/trunk/tools/llvm-objdump/COFFDump.cpp Thu Feb 20 00:51:07 2014
> > @@ -233,6 +233,25 @@ static void printCOFFSymbolAddress(llvm:
> >      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
> >      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
> >           << "\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
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140220/d0da5100/attachment.html>


More information about the llvm-commits mailing list