[llvm] [objcopy][coff] Place section name first in strtab (PR #145266)
Haohai Wen via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 25 00:42:20 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/5] 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/5] [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/5] 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
>From 7fe75534658dfe98e90865736daa477ac41c8134 Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Wed, 25 Jun 2025 15:23:03 +0800
Subject: [PATCH 4/5] Add comments
---
llvm/test/tools/llvm-objcopy/COFF/string-table.test | 1 +
1 file changed, 1 insertion(+)
diff --git a/llvm/test/tools/llvm-objcopy/COFF/string-table.test b/llvm/test/tools/llvm-objcopy/COFF/string-table.test
index ee3e0b5fb2cb3..84385a0ce3857 100644
--- a/llvm/test/tools/llvm-objcopy/COFF/string-table.test
+++ b/llvm/test/tools/llvm-objcopy/COFF/string-table.test
@@ -10,6 +10,7 @@
# CHECK-NEXT: [ 1a] symbol_aaa
# CHECK-NEXT: }
+# Symbol or section name is added into strtab only if it exceeds 8 characters.
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_AMD64
>From a766f3d1f4a3675f26993434ebfd172322a8125b Mon Sep 17 00:00:00 2001
From: Haohai Wen <haohai.wen at intel.com>
Date: Wed, 25 Jun 2025 15:42:00 +0800
Subject: [PATCH 5/5] Address comments
---
llvm/test/tools/llvm-objcopy/COFF/string-table.test | 4 +++-
1 file changed, 3 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 84385a0ce3857..aef710b694127 100644
--- a/llvm/test/tools/llvm-objcopy/COFF/string-table.test
+++ b/llvm/test/tools/llvm-objcopy/COFF/string-table.test
@@ -1,3 +1,6 @@
+## Show that section names appear before symbol names in the COFF strtab.
+## These names are only added to the strtab if they exceed 8 characters.
+
# RUN: yaml2obj %s -o %t
# RUN: touch %t.sec
# RUN: llvm-objcopy --add-section=.debug_str=%t.sec %t %t1
@@ -10,7 +13,6 @@
# CHECK-NEXT: [ 1a] symbol_aaa
# CHECK-NEXT: }
-# Symbol or section name is added into strtab only if it exceeds 8 characters.
--- !COFF
header:
Machine: IMAGE_FILE_MACHINE_AMD64
More information about the llvm-commits
mailing list