forked from OSchip/llvm-project
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. llvm-svn: 201638
This commit is contained in:
parent
9c37cbdb86
commit
c514a8041f
|
@ -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;
|
||||
|
|
Binary file not shown.
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue