[lld] [LLD][COFF] Allow symbols with empty chunks to have no associated output section (PR #149523)
Jacek Caban via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 18 07:41:54 PDT 2025
https://github.com/cjacek created https://github.com/llvm/llvm-project/pull/149523
If a chunk is empty and there are no other non-empty chunks in the same section, `removeEmptySections()` will remove the entire section. In this case, use a section index of 0, as the MSVC linker does, instead of asserting.
>From d47879535ba1e7e754b5b35933c5890436908073 Mon Sep 17 00:00:00 2001
From: Jacek Caban <jacek at codeweavers.com>
Date: Fri, 18 Jul 2025 16:29:46 +0200
Subject: [PATCH] [LLD][COFF] Allow symbols with empty chunks to have no
associated output section
If a chunk is empty and there are no other non-empty chunks in the same section,
removeEmptySections() will remove the entire section. In this case, use a section
index of 0, as the MSVC linker does, instead of asserting.
---
lld/COFF/PDB.cpp | 9 ++++++---
lld/test/COFF/pdb-empty-sec.s | 19 +++++++++++++++++++
2 files changed, 25 insertions(+), 3 deletions(-)
create mode 100644 lld/test/COFF/pdb-empty-sec.s
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp
index a54ea403ba2ec..94eeae2797971 100644
--- a/lld/COFF/PDB.cpp
+++ b/lld/COFF/PDB.cpp
@@ -1135,9 +1135,12 @@ static pdb::BulkPublic createPublic(COFFLinkerContext &ctx, Defined *def) {
pub.setFlags(flags);
OutputSection *os = ctx.getOutputSection(def->getChunk());
- assert(os && "all publics should be in final image");
- pub.Offset = def->getRVA() - os->getRVA();
- pub.Segment = os->sectionIndex;
+ assert((os || !def->getChunk()->getSize()) &&
+ "all publics should be in final image");
+ if (os) {
+ pub.Offset = def->getRVA() - os->getRVA();
+ pub.Segment = os->sectionIndex;
+ }
return pub;
}
diff --git a/lld/test/COFF/pdb-empty-sec.s b/lld/test/COFF/pdb-empty-sec.s
new file mode 100644
index 0000000000000..0d61447b76651
--- /dev/null
+++ b/lld/test/COFF/pdb-empty-sec.s
@@ -0,0 +1,19 @@
+// REQUIRES: x86
+
+// RUN: llvm-mc -filetype=obj -triple=x86_64-windows %s -o %t.obj
+// RUN: lld-link -dll -noentry -debug %t.obj -out:%t.dll
+// RUN: llvm-pdbutil dump -publics %t.pdb | FileCheck %s
+
+// CHECK: Records
+// CHECK-NEXT: 0 | S_PUB32 [size = 20] `func`
+// CHECK-NEXT: flags = none, addr = 0001:0000
+// CHECK-NEXT: 20 | S_PUB32 [size = 20] `sym`
+// CHECK-NEXT: flags = none, addr = 0000:0000
+
+ .globl sym
+ .data
+sym:
+ .text
+ .globl func
+func:
+ ret
More information about the llvm-commits
mailing list