[llvm] [objcopy][coff] Place section name first in strtab (PR #145266)
Haohai Wen via llvm-commits
llvm-commits at lists.llvm.org
Sun Jun 22 22:16:53 PDT 2025
https://github.com/HaohaiWen created https://github.com/llvm/llvm-project/pull/145266
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.
>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/2] 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/2] [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
More information about the llvm-commits
mailing list