[LLD] [COFF] Fix crashes for cfguard with undefined weak symbols (#79063)
authorMartin Storsjö <martin@martin.st>
Tue, 23 Jan 2024 18:37:03 +0000 (20:37 +0200)
committerGitHub <noreply@github.com>
Tue, 23 Jan 2024 18:37:03 +0000 (20:37 +0200)
When marking symbols as having their address taken, we can have the
sitaution where we have the address taken of a weak symbol. If there's
no strong definition of the symbol, the symbol ends up as an absolute
symbol with the value null. In those cases, we don't have any Chunk.
Skip such symbols from the cfguard tables.

This fixes https://github.com/llvm/llvm-project/issues/78619.

lld/COFF/Writer.cpp
lld/test/COFF/cfguard-weak-undef.s [new file with mode: 0644]

index 2e34a6c5cfa2c0e5a33813e44ed27065eb86289a..9c20bbb83d86d19aca08ef611259bc70f4ae850a 100644 (file)
@@ -1802,6 +1802,8 @@ void Writer::createSEHTable() {
 // symbol's offset into that Chunk.
 static void addSymbolToRVASet(SymbolRVASet &rvaSet, Defined *s) {
   Chunk *c = s->getChunk();
+  if (!c)
+    return;
   if (auto *sc = dyn_cast<SectionChunk>(c))
     c = sc->repl; // Look through ICF replacement.
   uint32_t off = s->getRVA() - (c ? c->getRVA() : 0);
diff --git a/lld/test/COFF/cfguard-weak-undef.s b/lld/test/COFF/cfguard-weak-undef.s
new file mode 100644 (file)
index 0000000..fd4121a
--- /dev/null
@@ -0,0 +1,27 @@
+# REQUIRES: x86
+# RUN: llvm-mc -triple=x86_64-windows-gnu -filetype=obj -o %t.obj %s
+# RUN: lld-link %t.obj /out:%t.exe /entry:entry /subsystem:console /guard:cf
+
+       .def    @feat.00;
+       .scl    3;
+       .type   0;
+       .endef
+       .globl  @feat.00
+.set @feat.00, 2048
+
+       .globl  entry
+entry:
+       retq
+
+       .data
+       .globl  funcs
+funcs:
+       .quad   weakfunc
+
+       .section        .gfids$y,"dr"
+       .symidx weakfunc
+       .section        .giats$y,"dr"
+       .section        .gljmp$y,"dr"
+       .weak   weakfunc
+       .addrsig
+       .addrsig_sym weakfunc