Skip to content

Commit 5f1e509

Browse files
committed
[llvm-objdump] -p: Dump PE header for PE/COFF
For a trivial DLL built with `clang --target=x86_64-windows -O2 -c a.c; lld-link -subsystem:console -dll a.o -out:a.dll`, `objdump -p` vs `llvm-objdump -p`: ``` -a.dll: file format pei-x86-64 - +a.dll: file format coff-x86-64 Characteristics 0x2022 executable large address aware @@ -57,4 +56,4 @@ Entry d 0000000000000000 00000000 Delay Import Directory Entry e 0000000000000000 00000000 CLR Runtime Header Entry f 0000000000000000 00000000 Reserved - +Export Table: ``` For a Linux image (`vmlinuz-5.10.76-gentoo-r1`) built with `CONFIG_EFI_STUB=y` ``` -vmlinuz-5.10.76-gentoo-r1: file format pei-x86-64 - -Characteristics 0x20e +vmlinuz-5.10.76-gentoo-r1: file format coff-x86-64 +Characteristics 0x206 executable line numbers stripped - symbols stripped debugging information removed Time/Date Wed Dec 31 16:00:00 1969 @@ -55,10 +53,4 @@ Entry d 0000000000000000 00000000 Delay Import Directory Entry e 0000000000000000 00000000 CLR Runtime Header Entry f 0000000000000000 00000000 Reserved - - -PE File Base Relocations (interpreted .reloc section contents) - -Virtual Address: 000037ca Chunk size 10 (0xa) Number of fixups 1 - reloc 0 offset 0 [37ca] ABSOLUTE - +Export Table: ``` `symbols stripped` looks like a GNU objdump problem. Reviewed By: jhenderson, alexander-shaposhnikov Differential Revision: https://reviews.llvm.org/D113356
1 parent ee88b8d commit 5f1e509

File tree

5 files changed

+379
-8
lines changed

5 files changed

+379
-8
lines changed
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
# RUN: yaml2obj --docnum=1 %s -o %t
2+
# RUN: llvm-objdump -p %t | FileCheck %s --check-prefix=PE32PLUS --strict-whitespace --match-full-lines
3+
4+
# PE32PLUS:{{.*}}file format coff-arm64
5+
# PE32PLUS-NEXT:Characteristics 0x22
6+
# PE32PLUS-NEXT: executable
7+
# PE32PLUS-NEXT: large address aware
8+
#PE32PLUS-EMPTY:
9+
# PE32PLUS-NEXT:Time/Date {{.*}} 19{{69|70}}
10+
# PE32PLUS-NEXT:Magic 020b (PE32+)
11+
# PE32PLUS-NEXT:MajorLinkerVersion 0
12+
# PE32PLUS-NEXT:MinorLinkerVersion 0
13+
# PE32PLUS-NEXT:SizeOfCode 0000000000000200
14+
# PE32PLUS-NEXT:SizeOfInitializedData 0000000000000400
15+
# PE32PLUS-NEXT:SizeOfUninitializedData 0000000000000000
16+
# PE32PLUS-NEXT:AddressOfEntryPoint 0000000000001000
17+
# PE32PLUS-NEXT:BaseOfCode 0000000000001000
18+
# PE32PLUS-NEXT:ImageBase 0000000140000000
19+
# PE32PLUS-NEXT:SectionAlignment 00001000
20+
# PE32PLUS-NEXT:FileAlignment 00000200
21+
# PE32PLUS-NEXT:MajorOSystemVersion 6
22+
# PE32PLUS-NEXT:MinorOSystemVersion 1
23+
# PE32PLUS-NEXT:MajorImageVersion 7
24+
# PE32PLUS-NEXT:MinorImageVersion 2
25+
# PE32PLUS-NEXT:MajorSubsystemVersion 8
26+
# PE32PLUS-NEXT:MinorSubsystemVersion 3
27+
# PE32PLUS-NEXT:Win32Version 00000000
28+
# PE32PLUS-NEXT:SizeOfImage 00004000
29+
# PE32PLUS-NEXT:SizeOfHeaders 00000200
30+
# PE32PLUS-NEXT:CheckSum 00000000
31+
# PE32PLUS-NEXT:Subsystem 00000003 (Windows CUI)
32+
# PE32PLUS-NEXT:DllCharacteristics 00008160
33+
# PE32PLUS-NEXT: HIGH_ENTROPY_VA
34+
# PE32PLUS-NEXT: DYNAMIC_BASE
35+
# PE32PLUS-NEXT: NX_COMPAT
36+
# PE32PLUS-NEXT: TERMINAL_SERVER_AWARE
37+
# PE32PLUS-NEXT:SizeOfStackReserve 0000000000100000
38+
# PE32PLUS-NEXT:SizeOfStackCommit 0000000000001000
39+
# PE32PLUS-NEXT:SizeOfHeapReserve 0000000000100000
40+
# PE32PLUS-NEXT:SizeOfHeapCommit 0000000000001000
41+
# PE32PLUS-NEXT:LoaderFlags 00000000
42+
# PE32PLUS-NEXT:NumberOfRvaAndSizes 00000010
43+
#PE32PLUS-EMPTY:
44+
# PE32PLUS-NEXT:The Data Directory
45+
# PE32PLUS-NEXT:Entry 0 0000000000000000 00000000 Export Directory [.edata (or where ever we found it)]
46+
# PE32PLUS-NEXT:Entry 1 0000000000000000 00000000 Import Directory [parts of .idata]
47+
# PE32PLUS-NEXT:Entry 2 0000000000000000 00000000 Resource Directory [.rsrc]
48+
# PE32PLUS-NEXT:Entry 3 0000000000003000 00000008 Exception Directory [.pdata]
49+
# PE32PLUS-NEXT:Entry 4 0000000000000000 00000000 Security Directory
50+
# PE32PLUS-NEXT:Entry 5 0000000000000000 00000000 Base Relocation Directory [.reloc]
51+
# PE32PLUS-NEXT:Entry 6 0000000000000000 00000000 Debug Directory
52+
# PE32PLUS-NEXT:Entry 7 0000000000000000 00000000 Description Directory
53+
# PE32PLUS-NEXT:Entry 8 0000000000000000 00000000 Special Directory
54+
# PE32PLUS-NEXT:Entry 9 0000000000000000 00000000 Thread Storage Directory [.tls]
55+
# PE32PLUS-NEXT:Entry a 0000000000000000 00000000 Load Configuration Directory
56+
# PE32PLUS-NEXT:Entry b 0000000000000000 00000000 Bound Import Directory
57+
# PE32PLUS-NEXT:Entry c 0000000000000000 00000000 Import Address Table Directory
58+
# PE32PLUS-NEXT:Entry d 0000000000000000 00000000 Delay Import Directory
59+
# PE32PLUS-NEXT:Entry e 0000000000000000 00000000 CLR Runtime Header
60+
# PE32PLUS-NEXT:Entry f 0000000000000000 00000000 Reserved
61+
62+
--- !COFF
63+
OptionalHeader:
64+
AddressOfEntryPoint: 4096
65+
ImageBase: 0x140000000
66+
SectionAlignment: 4096
67+
FileAlignment: 512
68+
MajorOperatingSystemVersion: 6
69+
MinorOperatingSystemVersion: 1
70+
MajorImageVersion: 7
71+
MinorImageVersion: 2
72+
MajorSubsystemVersion: 8
73+
MinorSubsystemVersion: 3
74+
Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI
75+
DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT, IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE ]
76+
SizeOfStackReserve: 1048576
77+
SizeOfStackCommit: 4096
78+
SizeOfHeapReserve: 1048576
79+
SizeOfHeapCommit: 4096
80+
ExceptionTable:
81+
RelativeVirtualAddress: 12288
82+
Size: 8
83+
header:
84+
Machine: IMAGE_FILE_MACHINE_ARM64
85+
Characteristics: [ IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LARGE_ADDRESS_AWARE ]
86+
sections:
87+
- Name: .text
88+
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
89+
VirtualAddress: 4096
90+
VirtualSize: 4
91+
SectionData: C0035FD6
92+
- Name: .rdata
93+
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
94+
VirtualAddress: 8192
95+
VirtualSize: 12
96+
SectionData: 0100400800000000E4E3E3E3
97+
- Name: .pdata
98+
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ ]
99+
VirtualAddress: 12288
100+
VirtualSize: 8
101+
SectionData: '0010000000200000'
102+
symbols: []
103+
...
104+
105+
## Test 32-bit object with full Characteristics and DllCharacteristics.
106+
# RUN: yaml2obj --docnum=2 %s -o %t2
107+
# RUN: llvm-objdump -p %t2 | FileCheck %s --check-prefix=PE32 --match-full-lines
108+
# PE32:{{.*}}file format coff-i386
109+
# PE32:Characteristics 0xffbf
110+
# PE32-NEXT: relocations stripped
111+
# PE32-NEXT: executable
112+
# PE32-NEXT: line numbers stripped
113+
# PE32-NEXT: symbols stripped
114+
# PE32-NEXT: large address aware
115+
# PE32-NEXT: little endian
116+
# PE32-NEXT: 32 bit words
117+
# PE32-NEXT: debugging information removed
118+
# PE32-NEXT: copy to swap file if on removable media
119+
# PE32-NEXT: copy to swap file if on network media
120+
# PE32-NEXT: system file
121+
# PE32-NEXT: DLL
122+
# PE32-NEXT: run only on uniprocessor machine
123+
# PE32-NEXT: big endian
124+
#PE32-EMPTY:
125+
# PE32:Time/Date {{.*}}
126+
# PE32-NEXT:Magic 010b (PE32)
127+
# PE32-NEXT:MajorLinkerVersion 0
128+
# PE32-NEXT:MinorLinkerVersion 0
129+
# PE32-NEXT:SizeOfCode 00000004
130+
# PE32-NEXT:SizeOfInitializedData 00000000
131+
# PE32-NEXT:SizeOfUninitializedData 00000000
132+
# PE32-NEXT:AddressOfEntryPoint 00000000
133+
# PE32-NEXT:BaseOfCode 00001000
134+
# PE32-NEXT:BaseOfData 00000000
135+
# PE32-NEXT:ImageBase 00000000
136+
# PE32-NEXT:SectionAlignment 00000001
137+
# PE32-NEXT:FileAlignment 00000001
138+
# PE32-NEXT:MajorOSystemVersion 0
139+
# PE32-NEXT:MinorOSystemVersion 0
140+
# PE32-NEXT:MajorImageVersion 0
141+
# PE32-NEXT:MinorImageVersion 0
142+
# PE32-NEXT:MajorSubsystemVersion 0
143+
# PE32-NEXT:MinorSubsystemVersion 0
144+
# PE32-NEXT:Win32Version 00000000
145+
# PE32-NEXT:SizeOfImage 000001a4
146+
# PE32-NEXT:SizeOfHeaders 000001a0
147+
# PE32-NEXT:CheckSum 00000000
148+
# PE32-NEXT:Subsystem 0000000a (EFI application)
149+
# PE32-NEXT:DllCharacteristics 0000ffe0
150+
# PE32-NEXT: HIGH_ENTROPY_VA
151+
# PE32-NEXT: DYNAMIC_BASE
152+
# PE32-NEXT: FORCE_INTEGRITY
153+
# PE32-NEXT: NX_COMPAT
154+
# PE32-NEXT: NO_ISOLATION
155+
# PE32-NEXT: NO_SEH
156+
# PE32-NEXT: NO_BIND
157+
# PE32-NEXT: APPCONTAINER
158+
# PE32-NEXT: WDM_DRIVER
159+
# PE32-NEXT: GUARD_CF
160+
# PE32-NEXT: TERMINAL_SERVER_AWARE
161+
--- !COFF
162+
header:
163+
Machine: IMAGE_FILE_MACHINE_I386
164+
Characteristics: [ IMAGE_FILE_RELOCS_STRIPPED, IMAGE_FILE_EXECUTABLE_IMAGE, IMAGE_FILE_LINE_NUMS_STRIPPED,
165+
IMAGE_FILE_LOCAL_SYMS_STRIPPED, IMAGE_FILE_AGGRESSIVE_WS_TRIM, IMAGE_FILE_LARGE_ADDRESS_AWARE,
166+
IMAGE_FILE_BYTES_REVERSED_LO, IMAGE_FILE_32BIT_MACHINE, IMAGE_FILE_DEBUG_STRIPPED,
167+
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP, IMAGE_FILE_NET_RUN_FROM_SWAP, IMAGE_FILE_SYSTEM,
168+
IMAGE_FILE_DLL, IMAGE_FILE_UP_SYSTEM_ONLY, IMAGE_FILE_BYTES_REVERSED_HI ]
169+
OptionalHeader:
170+
Subsystem: IMAGE_SUBSYSTEM_EFI_APPLICATION
171+
DLLCharacteristics: [ IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA, IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE,
172+
IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY, IMAGE_DLL_CHARACTERISTICS_NX_COMPAT,
173+
IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION, IMAGE_DLL_CHARACTERISTICS_NO_SEH,
174+
IMAGE_DLL_CHARACTERISTICS_NO_BIND, IMAGE_DLL_CHARACTERISTICS_APPCONTAINER,
175+
IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER, IMAGE_DLL_CHARACTERISTICS_GUARD_CF,
176+
IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE ]
177+
sections:
178+
- Name: .text
179+
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
180+
VirtualAddress: 4096
181+
VirtualSize: 4
182+
SectionData: C0035FD6
183+
symbols:

llvm/tools/llvm-objdump/COFFDump.cpp

Lines changed: 194 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,159 @@ using namespace llvm::objdump;
3131
using namespace llvm::object;
3232
using namespace llvm::Win64EH;
3333

34+
namespace {
35+
template <typename T> struct EnumEntry {
36+
T Value;
37+
StringRef Name;
38+
};
39+
40+
class COFFDumper {
41+
public:
42+
explicit COFFDumper(const llvm::object::COFFObjectFile &Obj) : Obj(Obj) {
43+
Is64 = !Obj.getPE32Header();
44+
}
45+
46+
template <class PEHeader> void printPEHeader(const PEHeader &Hdr) const;
47+
48+
private:
49+
template <typename T> FormattedNumber formatAddr(T V) const {
50+
return format_hex_no_prefix(V, Is64 ? 16 : 8);
51+
};
52+
53+
uint32_t getBaseOfData(const void *Hdr) const {
54+
return Is64 ? 0 : static_cast<const pe32_header *>(Hdr)->BaseOfData;
55+
}
56+
57+
const llvm::object::COFFObjectFile &Obj;
58+
bool Is64;
59+
};
60+
} // namespace
61+
62+
constexpr EnumEntry<uint16_t> PEHeaderMagic[] = {
63+
{uint16_t(COFF::PE32Header::PE32), "PE32"},
64+
{uint16_t(COFF::PE32Header::PE32_PLUS), "PE32+"},
65+
};
66+
67+
constexpr EnumEntry<COFF::WindowsSubsystem> PEWindowsSubsystem[] = {
68+
{COFF::IMAGE_SUBSYSTEM_UNKNOWN, "unspecified"},
69+
{COFF::IMAGE_SUBSYSTEM_NATIVE, "NT native"},
70+
{COFF::IMAGE_SUBSYSTEM_WINDOWS_GUI, "Windows GUI"},
71+
{COFF::IMAGE_SUBSYSTEM_WINDOWS_CUI, "Windows CUI"},
72+
{COFF::IMAGE_SUBSYSTEM_POSIX_CUI, "POSIX CUI"},
73+
{COFF::IMAGE_SUBSYSTEM_WINDOWS_CE_GUI, "Wince CUI"},
74+
{COFF::IMAGE_SUBSYSTEM_EFI_APPLICATION, "EFI application"},
75+
{COFF::IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER, "EFI boot service driver"},
76+
{COFF::IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER, "EFI runtime driver"},
77+
{COFF::IMAGE_SUBSYSTEM_EFI_ROM, "SAL runtime driver"},
78+
{COFF::IMAGE_SUBSYSTEM_XBOX, "XBOX"},
79+
};
80+
81+
template <typename T, typename TEnum>
82+
static void printOptionalEnumName(T Value,
83+
ArrayRef<EnumEntry<TEnum>> EnumValues) {
84+
for (const EnumEntry<TEnum> &I : EnumValues)
85+
if (I.Value == Value) {
86+
outs() << "\t(" << I.Name << ')';
87+
return;
88+
}
89+
}
90+
91+
template <class PEHeader>
92+
void COFFDumper::printPEHeader(const PEHeader &Hdr) const {
93+
auto print = [](const char *K, auto V, const char *Fmt = "%d\n") {
94+
outs() << format("%-23s ", K) << format(Fmt, V);
95+
};
96+
auto printU16 = [&](const char *K, support::ulittle16_t V,
97+
const char *Fmt = "%d\n") { print(K, uint16_t(V), Fmt); };
98+
auto printU32 = [&](const char *K, support::ulittle32_t V,
99+
const char *Fmt = "%d\n") { print(K, uint32_t(V), Fmt); };
100+
auto printAddr = [=](const char *K, uint64_t V) {
101+
outs() << format("%-23s ", K) << formatAddr(V) << '\n';
102+
};
103+
104+
printU16("Magic", Hdr.Magic, "%04x");
105+
printOptionalEnumName(Hdr.Magic, makeArrayRef(PEHeaderMagic));
106+
outs() << '\n';
107+
print("MajorLinkerVersion", Hdr.MajorLinkerVersion);
108+
print("MinorLinkerVersion", Hdr.MinorLinkerVersion);
109+
printAddr("SizeOfCode", Hdr.SizeOfCode);
110+
printAddr("SizeOfInitializedData", Hdr.SizeOfInitializedData);
111+
printAddr("SizeOfUninitializedData", Hdr.SizeOfUninitializedData);
112+
printAddr("AddressOfEntryPoint", Hdr.AddressOfEntryPoint);
113+
printAddr("BaseOfCode", Hdr.BaseOfCode);
114+
if (!Is64)
115+
printAddr("BaseOfData", getBaseOfData(&Hdr));
116+
printAddr("ImageBase", Hdr.ImageBase);
117+
printU32("SectionAlignment", Hdr.SectionAlignment, "%08x\n");
118+
printU32("FileAlignment", Hdr.FileAlignment, "%08x\n");
119+
printU16("MajorOSystemVersion", Hdr.MajorOperatingSystemVersion);
120+
printU16("MinorOSystemVersion", Hdr.MinorOperatingSystemVersion);
121+
printU16("MajorImageVersion", Hdr.MajorImageVersion);
122+
printU16("MinorImageVersion", Hdr.MinorImageVersion);
123+
printU16("MajorSubsystemVersion", Hdr.MajorSubsystemVersion);
124+
printU16("MinorSubsystemVersion", Hdr.MinorSubsystemVersion);
125+
printU32("Win32Version", Hdr.Win32VersionValue, "%08x\n");
126+
printU32("SizeOfImage", Hdr.SizeOfImage, "%08x\n");
127+
printU32("SizeOfHeaders", Hdr.SizeOfHeaders, "%08x\n");
128+
printU32("CheckSum", Hdr.CheckSum, "%08x\n");
129+
printU16("Subsystem", Hdr.Subsystem, "%08x");
130+
printOptionalEnumName(Hdr.Subsystem, makeArrayRef(PEWindowsSubsystem));
131+
outs() << '\n';
132+
133+
printU16("DllCharacteristics", Hdr.DLLCharacteristics, "%08x\n");
134+
#define FLAG(Name) \
135+
if (Hdr.DLLCharacteristics & COFF::IMAGE_DLL_CHARACTERISTICS_##Name) \
136+
outs() << "\t\t\t\t\t" << #Name << '\n';
137+
FLAG(HIGH_ENTROPY_VA);
138+
FLAG(DYNAMIC_BASE);
139+
FLAG(FORCE_INTEGRITY);
140+
FLAG(NX_COMPAT);
141+
FLAG(NO_ISOLATION);
142+
FLAG(NO_SEH);
143+
FLAG(NO_BIND);
144+
FLAG(APPCONTAINER);
145+
FLAG(WDM_DRIVER);
146+
FLAG(GUARD_CF);
147+
FLAG(TERMINAL_SERVER_AWARE);
148+
#undef FLAG
149+
150+
printAddr("SizeOfStackReserve", Hdr.SizeOfStackReserve);
151+
printAddr("SizeOfStackCommit", Hdr.SizeOfStackCommit);
152+
printAddr("SizeOfHeapReserve", Hdr.SizeOfHeapReserve);
153+
printAddr("SizeOfHeapCommit", Hdr.SizeOfHeapCommit);
154+
printU32("LoaderFlags", Hdr.LoaderFlags, "%08x\n");
155+
printU32("NumberOfRvaAndSizes", Hdr.NumberOfRvaAndSize, "%08x\n");
156+
157+
static const char *DirName[COFF::NUM_DATA_DIRECTORIES + 1] = {
158+
"Export Directory [.edata (or where ever we found it)]",
159+
"Import Directory [parts of .idata]",
160+
"Resource Directory [.rsrc]",
161+
"Exception Directory [.pdata]",
162+
"Security Directory",
163+
"Base Relocation Directory [.reloc]",
164+
"Debug Directory",
165+
"Description Directory",
166+
"Special Directory",
167+
"Thread Storage Directory [.tls]",
168+
"Load Configuration Directory",
169+
"Bound Import Directory",
170+
"Import Address Table Directory",
171+
"Delay Import Directory",
172+
"CLR Runtime Header",
173+
"Reserved",
174+
};
175+
outs() << "\nThe Data Directory\n";
176+
for (uint32_t I = 0; I != array_lengthof(DirName); ++I) {
177+
uint32_t Addr = 0, Size = 0;
178+
if (const data_directory *Data = Obj.getDataDirectory(I)) {
179+
Addr = Data->RelativeVirtualAddress;
180+
Size = Data->Size;
181+
}
182+
outs() << format("Entry %x ", I) << formatAddr(Addr)
183+
<< format(" %08x %s\n", uint32_t(Size), DirName[I]);
184+
}
185+
}
186+
34187
// Returns the name of the unwind code.
35188
static StringRef getUnwindCodeTypeName(uint8_t Code) {
36189
switch(Code) {
@@ -622,12 +775,47 @@ void objdump::printCOFFUnwindInfo(const COFFObjectFile *Obj) {
622775
}
623776
}
624777

625-
void objdump::printCOFFFileHeader(const object::ObjectFile *Obj) {
626-
const COFFObjectFile *file = dyn_cast<const COFFObjectFile>(Obj);
627-
printTLSDirectory(file);
628-
printLoadConfiguration(file);
629-
printImportTables(file);
630-
printExportTable(file);
778+
void objdump::printCOFFFileHeader(const COFFObjectFile &Obj) {
779+
COFFDumper CD(Obj);
780+
const uint16_t Cha = Obj.getCharacteristics();
781+
outs() << "Characteristics 0x" << Twine::utohexstr(Cha) << '\n';
782+
#define FLAG(F, Name) \
783+
if (Cha & F) \
784+
outs() << '\t' << Name << '\n';
785+
FLAG(COFF::IMAGE_FILE_RELOCS_STRIPPED, "relocations stripped");
786+
FLAG(COFF::IMAGE_FILE_EXECUTABLE_IMAGE, "executable");
787+
FLAG(COFF::IMAGE_FILE_LINE_NUMS_STRIPPED, "line numbers stripped");
788+
FLAG(COFF::IMAGE_FILE_LOCAL_SYMS_STRIPPED, "symbols stripped");
789+
FLAG(COFF::IMAGE_FILE_LARGE_ADDRESS_AWARE, "large address aware");
790+
FLAG(COFF::IMAGE_FILE_BYTES_REVERSED_LO, "little endian");
791+
FLAG(COFF::IMAGE_FILE_32BIT_MACHINE, "32 bit words");
792+
FLAG(COFF::IMAGE_FILE_DEBUG_STRIPPED, "debugging information removed");
793+
FLAG(COFF::IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP,
794+
"copy to swap file if on removable media");
795+
FLAG(COFF::IMAGE_FILE_NET_RUN_FROM_SWAP,
796+
"copy to swap file if on network media");
797+
FLAG(COFF::IMAGE_FILE_SYSTEM, "system file");
798+
FLAG(COFF::IMAGE_FILE_DLL, "DLL");
799+
FLAG(COFF::IMAGE_FILE_UP_SYSTEM_ONLY, "run only on uniprocessor machine");
800+
FLAG(COFF::IMAGE_FILE_BYTES_REVERSED_HI, "big endian");
801+
#undef FLAG
802+
803+
// TODO Support PE_IMAGE_DEBUG_TYPE_REPRO.
804+
// Since ctime(3) returns a 26 character string of the form:
805+
// "Sun Sep 16 01:03:52 1973\n\0"
806+
// just print 24 characters.
807+
const time_t Timestamp = Obj.getTimeDateStamp();
808+
outs() << format("\nTime/Date %.24s\n", ctime(&Timestamp));
809+
810+
if (const pe32_header *Hdr = Obj.getPE32Header())
811+
CD.printPEHeader<pe32_header>(*Hdr);
812+
else if (const pe32plus_header *Hdr = Obj.getPE32PlusHeader())
813+
CD.printPEHeader<pe32plus_header>(*Hdr);
814+
815+
printTLSDirectory(&Obj);
816+
printLoadConfiguration(&Obj);
817+
printImportTables(&Obj);
818+
printExportTable(&Obj);
631819
}
632820

633821
void objdump::printCOFFSymbolTable(const object::COFFImportFile *i) {

0 commit comments

Comments
 (0)