[llvm] [llvm-readobj] Support --string-table for COFF (PR #141552)

Haohai Wen via llvm-commits llvm-commits at lists.llvm.org
Tue May 27 04:03:22 PDT 2025


https://github.com/HaohaiWen updated https://github.com/llvm/llvm-project/pull/141552

>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 1/4] [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">;
 

>From ca7648117955bbc7c67673c2c0312cf349418acc Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Tue, 27 May 2025 17:40:53 +0800
Subject: [PATCH 2/4] Address comments

---
 .../tools/llvm-readobj/COFF/string-table.test | 51 ++++---------------
 llvm/tools/llvm-readobj/ObjDumper.h           |  2 +
 2 files changed, 12 insertions(+), 41 deletions(-)

diff --git a/llvm/test/tools/llvm-readobj/COFF/string-table.test b/llvm/test/tools/llvm-readobj/COFF/string-table.test
index 6165594b5914f..34247a0d17ee7 100644
--- a/llvm/test/tools/llvm-readobj/COFF/string-table.test
+++ b/llvm/test/tools/llvm-readobj/COFF/string-table.test
@@ -1,57 +1,26 @@
 # RUN: yaml2obj %s -o %t.obj
 # RUN: llvm-readobj --string-table %t.obj | FileCheck %s
+# RUN: llvm-readobj --string-table %p/Inputs/zero-string-table.obj.coff-i386 | FileCheck %s --check-prefix=ZERO-STRING-TABLE
 
-# CHECK: StringTable {
-# CHECK:   Length: 49
-# CHECK:   [     4] .debug_str
-# CHECK:   [     f] ?x@@3HA_test_test
-# CHECK:   [    21] _main_test_test
-# CHECK: }
+# CHECK:      StringTable {
+# CHECK-NEXT:   Length: 31
+# CHECK-NEXT:   [     4] .debug_str
+# CHECK-NEXT:   [     f] _main_test_test
+# CHECK-NEXT: }
+
+# ZERO-STRING-TABLE:      StringTable {
+# ZERO-STRING-TABLE-NEXT:   Length: 4
+# ZERO-STRING-TABLE-NEXT: }
 
 --- !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
diff --git a/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h
index e4c37318e8a4d..a76afbe9c88c7 100644
--- a/llvm/tools/llvm-readobj/ObjDumper.h
+++ b/llvm/tools/llvm-readobj/ObjDumper.h
@@ -159,6 +159,8 @@ class ObjDumper {
 
   // Only implemented for XCOFF/COFF.
   virtual void printStringTable() {}
+
+  // Only implemented for XCOFF.
   virtual void printAuxiliaryHeader() {}
   virtual void printExceptionSection() {}
   virtual void printLoaderSection(bool PrintHeader, bool PrintSymbols,

>From 36ceb09b1db2921654f4b3093a9c19d3ecc27e9b Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Tue, 27 May 2025 18:03:07 +0800
Subject: [PATCH 3/4] Address comments

---
 .../tools/llvm-readobj/COFF/string-table.test | 28 ++++++++++++-------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/llvm/test/tools/llvm-readobj/COFF/string-table.test b/llvm/test/tools/llvm-readobj/COFF/string-table.test
index 34247a0d17ee7..bc45d7d839683 100644
--- a/llvm/test/tools/llvm-readobj/COFF/string-table.test
+++ b/llvm/test/tools/llvm-readobj/COFF/string-table.test
@@ -1,16 +1,24 @@
 # RUN: yaml2obj %s -o %t.obj
-# RUN: llvm-readobj --string-table %t.obj | FileCheck %s
-# RUN: llvm-readobj --string-table %p/Inputs/zero-string-table.obj.coff-i386 | FileCheck %s --check-prefix=ZERO-STRING-TABLE
+# RUN: llvm-readobj --string-table %t.obj \
+# RUN:   %p/Inputs/coff-load-config-x64.dll \
+# RUN:   %p/Inputs/zero-string-table.obj.coff-i386 | FileCheck %s
 
-# CHECK:      StringTable {
-# CHECK-NEXT:   Length: 31
-# CHECK-NEXT:   [     4] .debug_str
-# CHECK-NEXT:   [     f] _main_test_test
-# CHECK-NEXT: }
+# CHECK-LABEL: File: {{.*}}/string-table.test.tmp.obj
+# CHECK:       StringTable {
+# CHECK-NEXT:    Length: 31
+# CHECK-NEXT:    [     4] .debug_str
+# CHECK-NEXT:    [     f] _main_test_test
+# CHECK-NEXT:  }
 
-# ZERO-STRING-TABLE:      StringTable {
-# ZERO-STRING-TABLE-NEXT:   Length: 4
-# ZERO-STRING-TABLE-NEXT: }
+# CHECK-LABEL: File: {{.*}}/coff-load-config-x64.dll
+# CHECK:       StringTable {
+# CHECK-NEXT:    Length: 0
+# CHECK-NEXT:  }
+
+# CHECK-LABEL: File: {{.*}}/zero-string-table.obj.coff-i386
+# CHECK:       StringTable {
+# CHECK-NEXT:    Length: 4
+# CHECK-NEXT:  }
 
 --- !COFF
 header:

>From dbb54a5da29a40dad15a4ca1d396bb0b3e262476 Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Tue, 27 May 2025 19:02:43 +0800
Subject: [PATCH 4/4] Fix windows path bug

---
 llvm/test/tools/llvm-readobj/COFF/string-table.test | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/llvm/test/tools/llvm-readobj/COFF/string-table.test b/llvm/test/tools/llvm-readobj/COFF/string-table.test
index bc45d7d839683..57de89f8009d7 100644
--- a/llvm/test/tools/llvm-readobj/COFF/string-table.test
+++ b/llvm/test/tools/llvm-readobj/COFF/string-table.test
@@ -3,19 +3,19 @@
 # RUN:   %p/Inputs/coff-load-config-x64.dll \
 # RUN:   %p/Inputs/zero-string-table.obj.coff-i386 | FileCheck %s
 
-# CHECK-LABEL: File: {{.*}}/string-table.test.tmp.obj
+# CHECK-LABEL: File: {{.*}}string-table.test.tmp.obj
 # CHECK:       StringTable {
 # CHECK-NEXT:    Length: 31
 # CHECK-NEXT:    [     4] .debug_str
 # CHECK-NEXT:    [     f] _main_test_test
 # CHECK-NEXT:  }
 
-# CHECK-LABEL: File: {{.*}}/coff-load-config-x64.dll
+# CHECK-LABEL: File: {{.*}}coff-load-config-x64.dll
 # CHECK:       StringTable {
 # CHECK-NEXT:    Length: 0
 # CHECK-NEXT:  }
 
-# CHECK-LABEL: File: {{.*}}/zero-string-table.obj.coff-i386
+# CHECK-LABEL: File: {{.*}}zero-string-table.obj.coff-i386
 # CHECK:       StringTable {
 # CHECK-NEXT:    Length: 4
 # CHECK-NEXT:  }



More information about the llvm-commits mailing list