Skip to content

Commit b92cc78

Browse files
authored
[llvm-objdump] Print out xcoff load section of xcoff object file with option private-headers (#121226)
[llvm-objdump] Print out xcoff load section of xcoff object file with option private-headers
1 parent 9cf2465 commit b92cc78

File tree

2 files changed

+131
-0
lines changed

2 files changed

+131
-0
lines changed
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
## Test the --private-headers option for the loader section of XCOFF object files.
2+
3+
# RUN: yaml2obj --docnum=1 %s -o %t_xcoff32.o
4+
# RUN: yaml2obj --docnum=2 %s -o %t_xcoff64.o
5+
# RUN: llvm-objdump --private-headers %t_xcoff32.o |\
6+
# RUN: FileCheck %s --check-prefixes=CHECK32 --match-full-lines
7+
# RUN: llvm-objdump --private-headers %t_xcoff64.o |\
8+
# RUN: FileCheck %s --check-prefixes=CHECK64 --match-full-lines
9+
10+
# RUN: yaml2obj --docnum=1 %s -o %t-truncate.o
11+
# RUN: %python -c "with open('%/t-truncate.o', 'r+b') as input: input.truncate(60)"
12+
# RUN: llvm-objdump --private-headers %t-truncate.o 2>&1 |\
13+
# RUN: FileCheck --check-prefix=WARN %s
14+
15+
# WARN: The end of the file was unexpectedly encountered: loader section with offset 0x3c and size 0x20 goes past the end of the file
16+
17+
--- !XCOFF
18+
FileHeader:
19+
MagicNumber: 0x1DF
20+
Sections:
21+
- Name: .loader
22+
Flags: [ STYP_LOADER ]
23+
SectionData: "0000000100000003000000050000016D00000001000000A40000001800000211"
24+
## ^------- -Version=1
25+
## ^------- -NumberOfSymbolEntries=3
26+
## ^------- -NumberOfRelocationEntries=5
27+
## ^------- -LengthOfImportFileIDStringTable=365
28+
## ^------- -NumberOfImportFileIDs=1
29+
## ^------- -OffsetToImportFileIDs=0xA4
30+
## ^------- -LengthOfStringTable=24
31+
## ^------- -OffsetToStringTable=0x211
32+
33+
34+
--- !XCOFF
35+
FileHeader:
36+
MagicNumber: 0x1F7
37+
Sections:
38+
- Name: .loader
39+
Flags: [ STYP_LOADER ]
40+
SectionData: "0000000200000003000000050000016D000000010000002300000000000000D0000000000000023D00000000000000380000000000000080"
41+
## ^------- -Version=2
42+
## ^------- -NumberOfSymbolEntries=3
43+
## ^------- -NumberOfRelocationEntries=5
44+
## ^------- -LengthOfImportFileIDStringTable=365
45+
## ^------- -NumberOfImportFileIDs=1
46+
## ^------- --LengthOfStringTable=0x23
47+
## ^--------------- -OffsetToImportFileIDs=0xD0
48+
## ^--------------- -OffsetToStringTable=0x23D
49+
## ^-------------- -OffsetToSymbolTable=0x38
50+
## ^--------------- -OffsetToRelocationEntries=0x80
51+
52+
# CHECK32: ---File Header:
53+
# CHECK32-NEXT: Magic: 0x1df
54+
# CHECK32-NEXT: NumberOfSections: 1
55+
# CHECK32-NEXT: Timestamp: None (0)
56+
# CHECK32-NEXT: SymbolTableOffset: 0x0
57+
# CHECK32-NEXT: SymbolTableEntries: 0
58+
# CHECK32-NEXT: OptionalHeaderSize: 0x0
59+
# CHECK32-NEXT: Flags: 0x0
60+
61+
# CHECK32: ---Loader Section Header:
62+
# CHECK32-NEXT: Version: 1
63+
# CHECK32-NEXT: NumberOfSymbolEntries: 3
64+
# CHECK32-NEXT: NumberOfRelocationEntries: 5
65+
# CHECK32-NEXT: LengthOfImportFileIDStringTable: 365
66+
# CHECK32-NEXT: NumberOfImportFileIDs: 1
67+
# CHECK32-NEXT: OffsetToImportFileIDs: 0xa4
68+
# CHECK32-NEXT: LengthOfStringTable: 24
69+
# CHECK32-NEXT: OffsetToStringTable: 0x211
70+
71+
# CHECK64: ---File Header:
72+
# CHECK64-NEXT: Magic: 0x1f7
73+
# CHECK64-NEXT: NumberOfSections: 1
74+
# CHECK64-NEXT: Timestamp: None (0)
75+
# CHECK64-NEXT: SymbolTableOffset: 0x0
76+
# CHECK64-NEXT: SymbolTableEntries: 0
77+
# CHECK64-NEXT: OptionalHeaderSize: 0x0
78+
# CHECK64-NEXT: Flags: 0x0
79+
80+
# CHECK64: ---Loader Section Header:
81+
# CHECK64-NEXT: Version: 2
82+
# CHECK64-NEXT: NumberOfSymbolEntries: 3
83+
# CHECK64-NEXT: NumberOfRelocationEntries: 5
84+
# CHECK64-NEXT: LengthOfImportFileIDStringTable: 365
85+
# CHECK64-NEXT: NumberOfImportFileIDs: 1
86+
# CHECK64-NEXT: OffsetToImportFileIDs: 0xd0
87+
# CHECK64-NEXT: LengthOfStringTable: 35
88+
# CHECK64-NEXT: OffsetToStringTable: 0x23d
89+
# CHECK64-NEXT: OffsetToSymbolTable 0x38
90+
# CHECK64-NEXT: OffsetToRelocationEntries 0x80

llvm/tools/llvm-objdump/XCOFFDump.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class XCOFFDumper : public objdump::Dumper {
4242
void printPrivateHeaders() override;
4343
void printFileHeader();
4444
void printAuxiliaryHeader();
45+
void printLoaderSectionHeader();
4546
void printAuxiliaryHeader(const XCOFFAuxiliaryHeader32 *AuxHeader);
4647
void printAuxiliaryHeader(const XCOFFAuxiliaryHeader64 *AuxHeader);
4748
template <typename AuxHeaderMemberType, typename XCOFFAuxiliaryHeader>
@@ -66,6 +67,7 @@ class XCOFFDumper : public objdump::Dumper {
6667
void XCOFFDumper::printPrivateHeaders() {
6768
printFileHeader();
6869
printAuxiliaryHeader();
70+
printLoaderSectionHeader();
6971
}
7072

7173
FormattedString XCOFFDumper::formatName(StringRef Name) {
@@ -262,6 +264,45 @@ void XCOFFDumper::printAuxiliaryHeader(
262264
AuxSize, *AuxHeader);
263265
}
264266

267+
void XCOFFDumper::printLoaderSectionHeader() {
268+
Expected<uintptr_t> LoaderSectionAddrOrError =
269+
Obj.getSectionFileOffsetToRawData(XCOFF::STYP_LOADER);
270+
if (!LoaderSectionAddrOrError) {
271+
reportUniqueWarning(LoaderSectionAddrOrError.takeError());
272+
return;
273+
}
274+
uintptr_t LoaderSectionAddr = LoaderSectionAddrOrError.get();
275+
276+
if (LoaderSectionAddr == 0)
277+
return;
278+
279+
auto PrintLoadSecHeaderCommon = [&](const auto *LDHeader) {
280+
printNumber("Version:", LDHeader->Version);
281+
printNumber("NumberOfSymbolEntries:", LDHeader->NumberOfSymTabEnt);
282+
printNumber("NumberOfRelocationEntries:", LDHeader->NumberOfRelTabEnt);
283+
printNumber("LengthOfImportFileIDStringTable:",
284+
LDHeader->LengthOfImpidStrTbl);
285+
printNumber("NumberOfImportFileIDs:", LDHeader->NumberOfImpid);
286+
printHex("OffsetToImportFileIDs:", LDHeader->OffsetToImpid);
287+
printNumber("LengthOfStringTable:", LDHeader->LengthOfStrTbl);
288+
printHex("OffsetToStringTable:", LDHeader->OffsetToStrTbl);
289+
};
290+
291+
Width = 35;
292+
outs() << "\n---Loader Section Header:\n";
293+
if (Obj.is64Bit()) {
294+
const LoaderSectionHeader64 *LoaderSec64 =
295+
reinterpret_cast<const LoaderSectionHeader64 *>(LoaderSectionAddr);
296+
PrintLoadSecHeaderCommon(LoaderSec64);
297+
printHex("OffsetToSymbolTable", LoaderSec64->OffsetToSymTbl);
298+
printHex("OffsetToRelocationEntries", LoaderSec64->OffsetToRelEnt);
299+
} else {
300+
const LoaderSectionHeader32 *LoaderSec32 =
301+
reinterpret_cast<const LoaderSectionHeader32 *>(LoaderSectionAddr);
302+
PrintLoadSecHeaderCommon(LoaderSec32);
303+
}
304+
}
305+
265306
void XCOFFDumper::printFileHeader() {
266307
Width = 20;
267308
outs() << "\n---File Header:\n";

0 commit comments

Comments
 (0)