[llvm] r201638 - llvm-objdump/COFF: Print load configuration table.

Rui Ueyama ruiu at google.com
Tue Feb 18 19:53:11 PST 2014


Author: ruiu
Date: Tue Feb 18 21:53:11 2014
New Revision: 201638

URL: http://llvm.org/viewvc/llvm-project?rev=201638&view=rev
Log:
llvm-objdump/COFF: Print load configuration table.

Load Configuration Table may contain a pointer to SEH table. This patch is to
print the offset to the table. Printing SEH table contents is a TODO.

The layout of Layout Configuration Table is described in Microsoft PE/COFF
Object File Format Spec, but the table's offset/size descriptions seems to be
totally wrong, at least in revision 8.3 of the spec. I believe the table in
this patch is the correct one.

Modified:
    llvm/trunk/include/llvm/Object/COFF.h
    llvm/trunk/test/tools/llvm-objdump/Inputs/nop.exe.coff-i386
    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=201638&r1=201637&r2=201638&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/COFF.h (original)
+++ llvm/trunk/include/llvm/Object/COFF.h Tue Feb 18 21:53:11 2014
@@ -244,6 +244,29 @@ struct coff_aux_section_definition {
   char Unused[3];
 };
 
+struct coff_load_configuration32 {
+  support::ulittle32_t Characteristics;
+  support::ulittle32_t TimeDateStamp;
+  support::ulittle16_t MajorVersion;
+  support::ulittle16_t MinorVersion;
+  support::ulittle32_t GlobalFlagsClear;
+  support::ulittle32_t GlobalFlagsSet;
+  support::ulittle32_t CriticalSectionDefaultTimeout;
+  support::ulittle32_t DeCommitFreeBlockThreshold;
+  support::ulittle32_t DeCommitTotalFreeThreshold;
+  support::ulittle32_t LockPrefixTable;
+  support::ulittle32_t MaximumAllocationSize;
+  support::ulittle32_t VirtualMemoryThreshold;
+  support::ulittle32_t ProcessAffinityMask;
+  support::ulittle32_t ProcessHeapFlags;
+  support::ulittle16_t CSDVersion;
+  char Reserved[4];
+  support::ulittle32_t EditList;
+  support::ulittle32_t SecurityCookie;
+  support::ulittle32_t SEHandlerTable;
+  support::ulittle32_t SEHandlerCount;
+};
+
 class COFFObjectFile : public ObjectFile {
 private:
   friend class ImportDirectoryEntryRef;

Modified: llvm/trunk/test/tools/llvm-objdump/Inputs/nop.exe.coff-i386
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/Inputs/nop.exe.coff-i386?rev=201638&r1=201637&r2=201638&view=diff
==============================================================================
Binary files llvm/trunk/test/tools/llvm-objdump/Inputs/nop.exe.coff-i386 (original) and llvm/trunk/test/tools/llvm-objdump/Inputs/nop.exe.coff-i386 Tue Feb 18 21:53:11 2014 differ

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=201638&r1=201637&r2=201638&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test (original)
+++ llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test Tue Feb 18 21:53:11 2014
@@ -1,11 +1,37 @@
 // RUN: llvm-objdump -p %p/Inputs/nop.exe.coff-i386 | \
 // RUN:   FileCheck -check-prefix=IMPORT %s
 
-IMPORT:       The Import Tables:
-IMPORT-NEXT:  lookup 00005028 time 00000000 fwd 00000000 name 00005096 addr 00005058
-IMPORT:       DLL Name: KERNEL32.dll
+IMPORT:      The Import Tables:
+IMPORT:        lookup 000021e4 time 00000000 fwd 00000000 name 0000234a addr 00002024
+IMPORT:          DLL Name: MSVCR110.dll
 IMPORT-NEXT:     Hint/Ord  Name
-IMPORT-NEXT:          365  ExitProcess
+IMPORT-NEXT:          767  _initterm_e
+IMPORT-NEXT:          766  _initterm
+IMPORT-NEXT:          437  __initenv
+IMPORT-NEXT:          660  _fmode
+IMPORT-NEXT:          571  _commode
+IMPORT-NEXT:          315  ?terminate@@YAXXZ
+IMPORT-NEXT:          424  __crtSetUnhandledExceptionFilter
+IMPORT-NEXT:          892  _lock
+IMPORT-NEXT:         1254  _unlock
+IMPORT-NEXT:          498  __setusermatherr
+IMPORT-NEXT:          428  __dllonexit
+IMPORT-NEXT:         1058  _onexit
+IMPORT-NEXT:          774  _invoke_watson
+IMPORT-NEXT:          575  _controlfp_s
+IMPORT-NEXT:          624  _except_handler4_common
+IMPORT-NEXT:          587  _crt_debugger_hook
+IMPORT-NEXT:          426  __crtUnhandledException
+IMPORT-NEXT:          425  __crtTerminateProcess
+IMPORT-NEXT:          572  _configthreadlocale
+IMPORT-NEXT:          556  _cexit
+IMPORT-NEXT:          633  _exit
+IMPORT-NEXT:         1484  exit
+IMPORT-NEXT:          496  __set_app_type
+IMPORT-NEXT:          436  __getmainargs
+IMPORT-NEXT:          533  _amsg_exit
+IMPORT-NEXT:          555  _calloc_crt
+IMPORT-NEXT:          367  _XcptFilter
 
 // RUN: llvm-objdump -p %p/Inputs/export.dll.coff-i386 | \
 // RUN:   FileCheck -check-prefix=EXPORT %s
@@ -16,3 +42,25 @@ EXPORT-NEXT:  Ordinal base: 5
 EXPORT-NEXT:  Ordinal      RVA  Name
 EXPORT-NEXT:        5   0x2008
 EXPORT-NEXT:        6   0x2010  exportfn2
+
+// RUN: llvm-objdump -p %p/Inputs/nop.exe.coff-i386 | \
+// RUN:   FileCheck -check-prefix=LOADCFG %s
+
+LOADCFG:      Load configuration:
+LOADCFG-NEXT:   Timestamp: 0
+LOADCFG-NEXT:   Major Version: 0
+LOADCFG-NEXT:   Minor Version: 0
+LOADCFG-NEXT:   GlobalFlags Clear: 0
+LOADCFG-NEXT:   GlobalFlags Set: 0
+LOADCFG-NEXT:   Critical Section Default Timeout: 0
+LOADCFG-NEXT:   Decommit Free Block Threshold: 0
+LOADCFG-NEXT:   Decommit Total Free Threshold: 0
+LOADCFG-NEXT:   Lock Prefix Table: 0
+LOADCFG-NEXT:   Maximum Allocation Size: 0
+LOADCFG-NEXT:   Virtual Memory Threshold: 0
+LOADCFG-NEXT:   Process Affinity Mask: 0
+LOADCFG-NEXT:   Process Heap Flags: 0
+LOADCFG-NEXT:   CSD Version: 0
+LOADCFG-NEXT:   Security Cookie: 554696768
+LOADCFG-NEXT:   SEH Table: 65600
+LOADCFG-NEXT:   SEH Count: 0

Modified: llvm/trunk/tools/llvm-objdump/COFFDump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/COFFDump.cpp?rev=201638&r1=201637&r2=201638&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/COFFDump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/COFFDump.cpp Tue Feb 18 21:53:11 2014
@@ -233,6 +233,46 @@ static void printCOFFSymbolAddress(llvm:
     Out << format(" + 0x%04x", Disp);
 }
 
+static void printLoadConfiguration(const COFFObjectFile *Obj) {
+  const coff_file_header *Header;
+  if (error(Obj->getCOFFHeader(Header)))
+    return;
+  // Currently only x86 is supported
+  if (Header->Machine != COFF::IMAGE_FILE_MACHINE_I386)
+    return;
+
+  const data_directory *DataDir;
+  if (error(Obj->getDataDirectory(COFF::LOAD_CONFIG_TABLE, DataDir)))
+    return;
+  uintptr_t IntPtr = 0;
+  if (DataDir->RelativeVirtualAddress == 0)
+    return;
+  if (error(Obj->getRvaPtr(DataDir->RelativeVirtualAddress, IntPtr)))
+    return;
+  const coff_load_configuration32 *LoadConf =
+      reinterpret_cast<const coff_load_configuration32 *>(IntPtr);
+
+  outs() << "Load configuration:"
+         << "\n  Timestamp: " << LoadConf->TimeDateStamp
+         << "\n  Major Version: " << LoadConf->MajorVersion
+         << "\n  Minor Version: " << LoadConf->MinorVersion
+         << "\n  GlobalFlags Clear: " << LoadConf->GlobalFlagsClear
+         << "\n  GlobalFlags Set: " << LoadConf->GlobalFlagsSet
+         << "\n  Critical Section Default Timeout: " << LoadConf->CriticalSectionDefaultTimeout
+         << "\n  Decommit Free Block Threshold: " << LoadConf->DeCommitFreeBlockThreshold
+         << "\n  Decommit Total Free Threshold: " << LoadConf->DeCommitTotalFreeThreshold
+         << "\n  Lock Prefix Table: " << LoadConf->LockPrefixTable
+         << "\n  Maximum Allocation Size: " << LoadConf->MaximumAllocationSize
+         << "\n  Virtual Memory Threshold: " << LoadConf->VirtualMemoryThreshold
+         << "\n  Process Affinity Mask: " << LoadConf->ProcessAffinityMask
+         << "\n  Process Heap Flags: " << LoadConf->ProcessHeapFlags
+         << "\n  CSD Version: " << LoadConf->CSDVersion
+         << "\n  Security Cookie: " << LoadConf->SecurityCookie
+         << "\n  SEH Table: " << LoadConf->SEHandlerTable
+         << "\n  SEH Count: " << LoadConf->SEHandlerCount
+         << "\n\n";
+}
+
 // Prints import tables. The import table is a table containing the list of
 // DLL name and symbol names which will be linked by the loader.
 static void printImportTables(const COFFObjectFile *Obj) {
@@ -431,6 +471,7 @@ void llvm::printCOFFUnwindInfo(const COF
 
 void llvm::printCOFFFileHeader(const object::ObjectFile *Obj) {
   const COFFObjectFile *file = dyn_cast<const COFFObjectFile>(Obj);
+  printLoadConfiguration(file);
   printImportTables(file);
   printExportTable(file);
 }





More information about the llvm-commits mailing list