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

Rui Ueyama ruiu at google.com
Thu Feb 20 10:59:05 PST 2014


Ah, I was wrong. it's *not* safe to truncate uint64 to 32 there because VA
may not fit 32 bit integer. Fix is coming.


On Thu, Feb 20, 2014 at 10:49 AM, Rui Ueyama <ruiu at google.com> wrote:

> 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/6fbdbc33/attachment.html>


More information about the llvm-commits mailing list