From cb20a6e70a749a05c9f0d1e1c61df4f2ce5f82d4 Mon Sep 17 00:00:00 2001 From: zhijian Date: Fri, 27 Dec 2024 19:45:27 +0000 Subject: [PATCH 1/3] [llvm-objdump] Print out xcoff file header for xcoff object file with option private-headers --- .../XCOFF/private-headers-option.test | 83 +++++++++++++++++++ llvm/tools/llvm-objdump/XCOFFDump.cpp | 41 +++++++++ 2 files changed, 124 insertions(+) create mode 100644 llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test diff --git a/llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test b/llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test new file mode 100644 index 0000000000000..d3409810f0c25 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test @@ -0,0 +1,83 @@ +## Test the --privated-headers option for XCOFF object files. + +# RUN: yaml2obj --docnum=1 %s -o %t_xcoff32.o +# RUN: yaml2obj --docnum=2 %s -o %t_xcoff64.o +# RUN: llvm-objdump --private-headers %t_xcoff32.o |\ +# RUN: FileCheck %s --check-prefixes=CHECK32 --match-full-lines +# RUN: llvm-objdump --private-headers %t_xcoff64.o |\ +# RUN: FileCheck %s --check-prefixes=CHECK64 --match-full-lines + +--- !XCOFF +FileHeader: + MagicNumber: 0x1DF +Sections: + - Name: .loader + Flags: [ STYP_LOADER ] + SectionData: "0000000100000003000000050000016D00000001000000A40000001800000211" +## ^------- -Version=1 +## ^------- -NumberOfSymbolEntries=3 +## ^------- -NumberOfRelocationEntries=5 +## ^------- -LengthOfImportFileIDStringTable=365 +## ^------- -NumberOfImportFileIDs=1 +## ^------- -OffsetToImportFileIDs=0xA4 +## ^------- -LengthOfStringTable=24 +## ^------- -OffsetToStringTable=0x211 + + +--- !XCOFF +FileHeader: + MagicNumber: 0x1F7 +Sections: + - Name: .loader + Flags: [ STYP_LOADER ] + SectionData: "0000000200000003000000050000016D000000010000002300000000000000D0000000000000023D00000000000000380000000000000080" +## ^------- -Version=2 +## ^------- -NumberOfSymbolEntries=3 +## ^------- -NumberOfRelocationEntries=5 +## ^------- -LengthOfImportFileIDStringTable=365 +## ^------- -NumberOfImportFileIDs=1 +## ^------- --LengthOfStringTable=0x23 +## ^--------------- -OffsetToImportFileIDs=0xD0 +## ^--------------- -OffsetToStringTable=0x23D +## ^-------------- -OffsetToSymbolTable=0x38 +## ^--------------- -OffsetToRelocationEntries=0x80 + +# CHECK32: ---File Header: +# CHECK32-NEXT: Magic: 0x1df +# CHECK32-NEXT: NumberOfSections: 1 +# CHECK32-NEXT: Timestamp: None (0) +# CHECK32-NEXT: SymbolTableOffset: 0x0 +# CHECK32-NEXT: SymbolTableEntries: 0 +# CHECK32-NEXT: OptionalHeaderSize: 0x0 +# CHECK32-NEXT: Flags: 0x0 + +# CHECK32: ---Loader Section Header: +# CHECK32-NEXT: Version: 1 +# CHECK32-NEXT: NumberOfSymbolEntries: 3 +# CHECK32-NEXT: NumberOfRelocationEntries: 5 +# CHECK32-NEXT: LengthOfImportFileIDStringTable: 365 +# CHECK32-NEXT: NumberOfImportFileIDs: 1 +# CHECK32-NEXT: OffsetToImportFileIDs: 0xa4 +# CHECK32-NEXT: LengthOfStringTable: 24 +# CHECK32-NEXT: OffsetToStringTable: 0x211 + +# CHECK64: ---File Header: +# CHECK64-NEXT: Magic: 0x1f7 +# CHECK64-NEXT: NumberOfSections: 1 +# CHECK64-NEXT: Timestamp: None (0) +# CHECK64-NEXT: SymbolTableOffset: 0x0 +# CHECK64-NEXT: SymbolTableEntries: 0 +# CHECK64-NEXT: OptionalHeaderSize: 0x0 +# CHECK64-NEXT: Flags: 0x0 + +# CHECK64: ---Loader Section Header: +# CHECK64-NEXT: Version: 2 +# CHECK64-NEXT: NumberOfSymbolEntries: 3 +# CHECK64-NEXT: NumberOfRelocationEntries: 5 +# CHECK64-NEXT: LengthOfImportFileIDStringTable: 365 +# CHECK64-NEXT: NumberOfImportFileIDs: 1 +# CHECK64-NEXT: OffsetToImportFileIDs: 0xd0 +# CHECK64-NEXT: LengthOfStringTable: 35 +# CHECK64-NEXT: OffsetToStringTable: 0x23d +# CHECK64-NEXT: OffsetToSymbolTable 0x38 +# CHECK64-NEXT: OffsetToRelocationEntries 0x80 diff --git a/llvm/tools/llvm-objdump/XCOFFDump.cpp b/llvm/tools/llvm-objdump/XCOFFDump.cpp index 92f9ee4fb9f96..61dd0b8713979 100644 --- a/llvm/tools/llvm-objdump/XCOFFDump.cpp +++ b/llvm/tools/llvm-objdump/XCOFFDump.cpp @@ -42,6 +42,7 @@ class XCOFFDumper : public objdump::Dumper { void printPrivateHeaders() override; void printFileHeader(); void printAuxiliaryHeader(); + void printLoaderSectionHeader(); void printAuxiliaryHeader(const XCOFFAuxiliaryHeader32 *AuxHeader); void printAuxiliaryHeader(const XCOFFAuxiliaryHeader64 *AuxHeader); template @@ -66,6 +67,7 @@ class XCOFFDumper : public objdump::Dumper { void XCOFFDumper::printPrivateHeaders() { printFileHeader(); printAuxiliaryHeader(); + printLoaderSectionHeader(); } FormattedString XCOFFDumper::formatName(StringRef Name) { @@ -262,6 +264,45 @@ void XCOFFDumper::printAuxiliaryHeader( AuxSize, *AuxHeader); } +void XCOFFDumper::printLoaderSectionHeader() { + Expected LoaderSectionAddrOrError = + Obj.getSectionFileOffsetToRawData(XCOFF::STYP_LOADER); + if (!LoaderSectionAddrOrError) { + reportUniqueWarning(LoaderSectionAddrOrError.takeError()); + return; + } + uintptr_t LoaderSectionAddr = LoaderSectionAddrOrError.get(); + + if (LoaderSectionAddr == 0) + return; + + auto PrintLoadSecHeaderCommon = [&](const auto *LDHeader) { + printNumber("Version:", LDHeader->Version); + printNumber("NumberOfSymbolEntries:", LDHeader->NumberOfSymTabEnt); + printNumber("NumberOfRelocationEntries:", LDHeader->NumberOfRelTabEnt); + printNumber("LengthOfImportFileIDStringTable:", + LDHeader->LengthOfImpidStrTbl); + printNumber("NumberOfImportFileIDs:", LDHeader->NumberOfImpid); + printHex("OffsetToImportFileIDs:", LDHeader->OffsetToImpid); + printNumber("LengthOfStringTable:", LDHeader->LengthOfStrTbl); + printHex("OffsetToStringTable:", LDHeader->OffsetToStrTbl); + }; + + Width = 35; + outs() << "\n---Loader Section Header:\n"; + if (Obj.is64Bit()) { + const LoaderSectionHeader64 *LoaderSec64 = + reinterpret_cast(LoaderSectionAddr); + PrintLoadSecHeaderCommon(LoaderSec64); + printHex("OffsetToSymbolTable", LoaderSec64->OffsetToSymTbl); + printHex("OffsetToRelocationEntries", LoaderSec64->OffsetToRelEnt); + } else { + const LoaderSectionHeader32 *LoaderSec32 = + reinterpret_cast(LoaderSectionAddr); + PrintLoadSecHeaderCommon(LoaderSec32); + } +} + void XCOFFDumper::printFileHeader() { Width = 20; outs() << "\n---File Header:\n"; From dce510945587420a9b2f49a2ad3794a1968aa8fe Mon Sep 17 00:00:00 2001 From: zhijian Date: Fri, 27 Dec 2024 19:58:12 +0000 Subject: [PATCH 2/3] minor change --- llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test b/llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test index d3409810f0c25..29fe9beff4b5e 100644 --- a/llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test +++ b/llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test @@ -1,4 +1,4 @@ -## Test the --privated-headers option for XCOFF object files. +## Test the --private-headers option for the loader section of XCOFF object files. # RUN: yaml2obj --docnum=1 %s -o %t_xcoff32.o # RUN: yaml2obj --docnum=2 %s -o %t_xcoff64.o From 2ecfb5398d643f4d2d73497cb27e2cb99e80b427 Mon Sep 17 00:00:00 2001 From: zhijian Date: Tue, 14 Jan 2025 18:37:18 +0000 Subject: [PATCH 3/3] add warnning test scenario --- .../tools/llvm-objdump/XCOFF/private-headers-option.test | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test b/llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test index 29fe9beff4b5e..db88f36e16503 100644 --- a/llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test +++ b/llvm/test/tools/llvm-objdump/XCOFF/private-headers-option.test @@ -7,6 +7,13 @@ # RUN: llvm-objdump --private-headers %t_xcoff64.o |\ # RUN: FileCheck %s --check-prefixes=CHECK64 --match-full-lines +# RUN: yaml2obj --docnum=1 %s -o %t-truncate.o +# RUN: %python -c "with open('%/t-truncate.o', 'r+b') as input: input.truncate(60)" +# RUN: llvm-objdump --private-headers %t-truncate.o 2>&1 |\ +# RUN: FileCheck --check-prefix=WARN %s + +# WARN: The end of the file was unexpectedly encountered: loader section with offset 0x3c and size 0x20 goes past the end of the file + --- !XCOFF FileHeader: MagicNumber: 0x1DF