From 50d33c62ad8786400a712b01150f6decaf070782 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Tue, 23 Jan 2024 20:37:03 +0200 Subject: [PATCH] [LLD] [COFF] Fix crashes for cfguard with undefined weak symbols (#79063) 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 | 2 ++ lld/test/COFF/cfguard-weak-undef.s | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 lld/test/COFF/cfguard-weak-undef.s diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index 2e34a6c5cfa2..9c20bbb83d86 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -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(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 index 000000000000..fd4121ac27df --- /dev/null +++ b/lld/test/COFF/cfguard-weak-undef.s @@ -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