]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - opencl/llvm.git/commitdiff
llvm-objdump/COFF: Print load configuration table.
authorRui Ueyama <ruiu@google.com>
Wed, 19 Feb 2014 03:53:11 +0000 (03:53 +0000)
committerRui Ueyama <ruiu@google.com>
Wed, 19 Feb 2014 03:53:11 +0000 (03:53 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201638 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/COFF.h
test/tools/llvm-objdump/Inputs/nop.exe.coff-i386
test/tools/llvm-objdump/coff-private-headers.test
tools/llvm-objdump/COFFDump.cpp

index 264a851e8538a747cf7673b3d1ba600c3fd42393..6ce5490606889298b5deda94785325b92e177915 100644 (file)
@@ -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;
index 68c9d3db0f8f93f1b9c3772d059e4b483d49ab53..2cda30ff3d2b325355d6c23e1e06fa662cbc76cc 100644 (file)
Binary files a/test/tools/llvm-objdump/Inputs/nop.exe.coff-i386 and b/test/tools/llvm-objdump/Inputs/nop.exe.coff-i386 differ
index de3de9001db15aea5ded4384ebbfca7c12234377..24d1b96cfc77ca02f94348b550430a37f1ff7cb8 100644 (file)
@@ -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
index f6f0f15197b93f73172f12f237c9194197baff8a..883786d4f6645c7baf54645080a9a8432e07bec3 100644 (file)
@@ -233,6 +233,46 @@ static void printCOFFSymbolAddress(llvm::raw_ostream &Out,
     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 COFFObjectFile *Obj) {
 
 void llvm::printCOFFFileHeader(const object::ObjectFile *Obj) {
   const COFFObjectFile *file = dyn_cast<const COFFObjectFile>(Obj);
+  printLoadConfiguration(file);
   printImportTables(file);
   printExportTable(file);
 }