[llvm] [llvm-readobj] Support --symbol-table for COFF (PR #141552)
Haohai Wen via llvm-commits
llvm-commits at lists.llvm.org
Mon May 26 23:39:58 PDT 2025
https://github.com/HaohaiWen created https://github.com/llvm/llvm-project/pull/141552
None
>From d55bb8c62e58ebe67dfe0f737ebc85735ff49327 Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Tue, 27 May 2025 14:37:13 +0800
Subject: [PATCH] [llvm-readobj] Support --symbol-table for COFF
---
llvm/include/llvm/Object/COFF.h | 4 ++
.../tools/llvm-readobj/COFF/string-table.test | 60 +++++++++++++++++++
llvm/tools/llvm-readobj/COFFDumper.cpp | 12 ++++
llvm/tools/llvm-readobj/ObjDumper.h | 2 +-
llvm/tools/llvm-readobj/Opts.td | 2 +-
5 files changed, 78 insertions(+), 2 deletions(-)
create mode 100644 llvm/test/tools/llvm-readobj/COFF/string-table.test
diff --git a/llvm/include/llvm/Object/COFF.h b/llvm/include/llvm/Object/COFF.h
index 3d0738c409049..bf13c0d01cfd9 100644
--- a/llvm/include/llvm/Object/COFF.h
+++ b/llvm/include/llvm/Object/COFF.h
@@ -939,6 +939,10 @@ class COFFObjectFile : public ObjectFile {
return uintptr_t(0);
}
+ StringRef getStringTable() const {
+ return StringRef(StringTable, StringTableSize);
+ }
+
uint16_t getMachine() const {
if (COFFHeader) {
if (CHPEMetadata) {
diff --git a/llvm/test/tools/llvm-readobj/COFF/string-table.test b/llvm/test/tools/llvm-readobj/COFF/string-table.test
new file mode 100644
index 0000000000000..6165594b5914f
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/COFF/string-table.test
@@ -0,0 +1,60 @@
+# RUN: yaml2obj %s -o %t.obj
+# RUN: llvm-readobj --string-table %t.obj | FileCheck %s
+
+# CHECK: StringTable {
+# CHECK: Length: 49
+# CHECK: [ 4] .debug_str
+# CHECK: [ f] ?x@@3HA_test_test
+# CHECK: [ 21] _main_test_test
+# CHECK: }
+
+--- !COFF
+header:
+ Machine: IMAGE_FILE_MACHINE_AMD64
+ Characteristics: []
+sections:
+ - Name: .text
+ Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+ Alignment: 16
+ SectionData: 508D0500000000C70424000000005AC3
+ - Name: .debug_str
+ Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
+ Alignment: 1
+ SectionData: ''
+symbols:
+ - Name: .text
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ SectionDefinition:
+ Length: 16
+ NumberOfRelocations: 1
+ NumberOfLinenumbers: 0
+ CheckSum: 0
+ Number: 1
+ - Name: .debug_str
+ Value: 0
+ SectionNumber: 2
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ SectionDefinition:
+ Length: 0
+ NumberOfRelocations: 0
+ NumberOfLinenumbers: 0
+ CheckSum: 0
+ Number: 2
+ - Name: '?x@@3HA_test_test'
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+ - Name: _main_test_test
+ Value: 0
+ SectionNumber: 1
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_FUNCTION
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp
index 5d1d2a34d6442..dce8e60bda1ef 100644
--- a/llvm/tools/llvm-readobj/COFFDumper.cpp
+++ b/llvm/tools/llvm-readobj/COFFDumper.cpp
@@ -108,6 +108,7 @@ class COFFDumper : public ObjDumper {
void printStackMap() const override;
void printAddrsig() override;
void printCGProfile() override;
+ void printStringTable() override;
private:
StringRef getSymbolName(uint32_t Index);
@@ -2219,6 +2220,17 @@ void COFFDumper::printCGProfile() {
}
}
+void COFFDumper::printStringTable() {
+ DictScope DS(W, "StringTable");
+ StringRef StrTable = Obj->getStringTable();
+ uint32_t StrTabSize = StrTable.size();
+ W.printNumber("Length", StrTabSize);
+ // Print strings from the fifth byte, since the first four bytes contain the
+ // length (in bytes) of the string table (including the length field).
+ if (StrTabSize > 4)
+ printAsStringList(StrTable, 4);
+}
+
StringRef COFFDumper::getSymbolName(uint32_t Index) {
Expected<COFFSymbolRef> Sym = Obj->getSymbol(Index);
if (!Sym)
diff --git a/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h
index cd744e3bbfb71..e4c37318e8a4d 100644
--- a/llvm/tools/llvm-readobj/ObjDumper.h
+++ b/llvm/tools/llvm-readobj/ObjDumper.h
@@ -157,7 +157,7 @@ class ObjDumper {
llvm::codeview::GlobalTypeTableBuilder &GlobalCVTypes,
bool GHash) {}
- // Only implemented for XCOFF.
+ // Only implemented for XCOFF/COFF.
virtual void printStringTable() {}
virtual void printAuxiliaryHeader() {}
virtual void printExceptionSection() {}
diff --git a/llvm/tools/llvm-readobj/Opts.td b/llvm/tools/llvm-readobj/Opts.td
index 7d574d875d22e..f95461aaca1a7 100644
--- a/llvm/tools/llvm-readobj/Opts.td
+++ b/llvm/tools/llvm-readobj/Opts.td
@@ -44,7 +44,7 @@ defm sort_symbols : Eq<"sort-symbols", "Specify the keys to sort the symbols bef
def stack_sizes : FF<"stack-sizes", "Display contents of all stack sizes sections. This option has no effect for GNU style output">;
def stackmap : FF<"stackmap", "Display contents of stackmap section">;
defm string_dump : Eq<"string-dump", "Display the specified section(s) as a list of strings">, MetaVarName<"<name or index>">;
-def string_table : FF<"string-table", "Display the string table (only for XCOFF now)">;
+def string_table : FF<"string-table", "Display the string table (only for XCOFF/COFF now)">;
def symbols : FF<"symbols", "Display the symbol table. Also display the dynamic symbol table when using GNU output style for ELF">;
def unwind : FF<"unwind", "Display unwind information">;
More information about the llvm-commits
mailing list