[llvm] [objcopy][coff] Place section name first in strtab (PR #145266)

Haohai Wen via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 24 22:29:50 PDT 2025


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

>From 29dcf90d377fd7683219bca3e6aa54ae5b8a57e8 Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Mon, 23 Jun 2025 11:06:11 +0800
Subject: [PATCH 1/3] Add test

---
 .../tools/llvm-objcopy/COFF/string-table.test | 24 +++++++++++++++++++
 1 file changed, 24 insertions(+)
 create mode 100644 llvm/test/tools/llvm-objcopy/COFF/string-table.test

diff --git a/llvm/test/tools/llvm-objcopy/COFF/string-table.test b/llvm/test/tools/llvm-objcopy/COFF/string-table.test
new file mode 100644
index 0000000000000..16ee4f4a4abdd
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/COFF/string-table.test
@@ -0,0 +1,24 @@
+# RUN: yaml2obj %s -o %t
+# RUN: touch %t.sec
+# RUN: llvm-objcopy --add-section=.debug_str=%t.sec %t %t1
+# RUN: llvm-readobj --string-table %t1 | FileCheck %s
+
+# CHECK:      StringTable {
+# CHECK-NEXT:   Length: 26
+# CHECK-NEXT:   [     4] symbol_zzz
+# CHECK-NEXT:   [     f] .debug_str
+# CHECK-NEXT: }
+
+--- !COFF
+header:
+  Machine:         IMAGE_FILE_MACHINE_AMD64
+sections:
+  - Name:            .text
+    Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
+symbols:
+  - Name:            symbol_zzz
+    Value:           0
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL

>From 2401b47be0bfdef0bf14da9b13a17edbb43642ff Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Mon, 23 Jun 2025 13:07:10 +0800
Subject: [PATCH 2/3] [objcopy][coff] Place section name first in strtab

The prioritized string table builder was introduced in 9cc9efc. This
patch sets highest priority for the section name to place it at the
start of string table to avoid the issue described in 4d2eda2.
---
 llvm/lib/ObjCopy/COFF/COFFWriter.cpp                | 7 +++++--
 llvm/test/tools/llvm-objcopy/COFF/string-table.test | 4 ++--
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/ObjCopy/COFF/COFFWriter.cpp b/llvm/lib/ObjCopy/COFF/COFFWriter.cpp
index 734a1698d515b..350c4aec572c9 100644
--- a/llvm/lib/ObjCopy/COFF/COFFWriter.cpp
+++ b/llvm/lib/ObjCopy/COFF/COFFWriter.cpp
@@ -120,8 +120,11 @@ void COFFWriter::layoutSections() {
 
 Expected<size_t> COFFWriter::finalizeStringTable() {
   for (const auto &S : Obj.getSections())
-    if (S.Name.size() > COFF::NameSize)
-      StrTabBuilder.add(S.Name);
+    if (S.Name.size() > COFF::NameSize) {
+      // Put the section name at the start of strtab to ensure its offset is
+      // less than Max7DecimalOffset. Otherwise, lldb/gdb will not read it.
+      StrTabBuilder.add(S.Name, /*Priority=*/UINT8_MAX);
+    }
 
   for (const auto &S : Obj.getSymbols())
     if (S.Name.size() > COFF::NameSize)
diff --git a/llvm/test/tools/llvm-objcopy/COFF/string-table.test b/llvm/test/tools/llvm-objcopy/COFF/string-table.test
index 16ee4f4a4abdd..1e984cde59dc0 100644
--- a/llvm/test/tools/llvm-objcopy/COFF/string-table.test
+++ b/llvm/test/tools/llvm-objcopy/COFF/string-table.test
@@ -5,8 +5,8 @@
 
 # CHECK:      StringTable {
 # CHECK-NEXT:   Length: 26
-# CHECK-NEXT:   [     4] symbol_zzz
-# CHECK-NEXT:   [     f] .debug_str
+# CHECK-NEXT:   [     4] .debug_str
+# CHECK-NEXT:   [     f] symbol_zzz
 # CHECK-NEXT: }
 
 --- !COFF

>From ac8e1bd3b686237f8e34bb887cf1f798b27c2ca5 Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Wed, 25 Jun 2025 13:28:18 +0800
Subject: [PATCH 3/3] Add extra symbol to make the sorting more noticeable

---
 llvm/test/tools/llvm-objcopy/COFF/string-table.test | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/llvm/test/tools/llvm-objcopy/COFF/string-table.test b/llvm/test/tools/llvm-objcopy/COFF/string-table.test
index 1e984cde59dc0..ee3e0b5fb2cb3 100644
--- a/llvm/test/tools/llvm-objcopy/COFF/string-table.test
+++ b/llvm/test/tools/llvm-objcopy/COFF/string-table.test
@@ -4,9 +4,10 @@
 # RUN: llvm-readobj --string-table %t1 | FileCheck %s
 
 # CHECK:      StringTable {
-# CHECK-NEXT:   Length: 26
+# CHECK-NEXT:   Length: 37
 # CHECK-NEXT:   [     4] .debug_str
 # CHECK-NEXT:   [     f] symbol_zzz
+# CHECK-NEXT:   [    1a] symbol_aaa
 # CHECK-NEXT: }
 
 --- !COFF
@@ -16,6 +17,12 @@ sections:
   - Name:            .text
     Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
 symbols:
+  - Name:            symbol_aaa
+    Value:           0
+    SectionNumber:   1
+    SimpleType:      IMAGE_SYM_TYPE_NULL
+    ComplexType:     IMAGE_SYM_DTYPE_FUNCTION
+    StorageClass:    IMAGE_SYM_CLASS_EXTERNAL
   - Name:            symbol_zzz
     Value:           0
     SectionNumber:   1



More information about the llvm-commits mailing list