diff options
author | Martin Storsjö <martin@martin.st> | 2023-11-07 11:49:05 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-07 11:49:05 +0200 |
commit | 303370e87166305248122a03c9913fde02156f99 (patch) | |
tree | bd03d5add9c34d82358881fc58f7dc7a2c11e0b8 /lld | |
parent | 0d3eeac8c0f45410398a87f72ae38ea6ae1c3073 (diff) | |
download | llvm-303370e87166305248122a03c9913fde02156f99.zip llvm-303370e87166305248122a03c9913fde02156f99.tar.gz llvm-303370e87166305248122a03c9913fde02156f99.tar.bz2 |
[LLD] [COFF] Mark the symbol _tls_used as a GC root (#71336)
This is necessary if the object file containing _tls_used is built with
-fdata-sections; if this symbol is present, lld is going to include
references to it in the PE header, in the TLS_TABLE data directory.
Therefore, treat the symbol as a GC root, i.e. retain it (and whatever
other symbols the section chunk references) when doing doing GC
(/opt:ref), if the symbol is present.
Diffstat (limited to 'lld')
-rw-r--r-- | lld/COFF/Driver.cpp | 4 | ||||
-rw-r--r-- | lld/test/COFF/tls-used-gc.s | 21 |
2 files changed, 25 insertions, 0 deletions
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp index 5613c2e..b2d0edd 100644 --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -2472,6 +2472,10 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) { // resolve symbols and write indices, but don't generate native code or link). ctx.symtab.compileBitcodeFiles(); + if (Defined *d = + dyn_cast_or_null<Defined>(ctx.symtab.findUnderscore("_tls_used"))) + config->gcroot.push_back(d); + // If -thinlto-index-only is given, we should create only "index // files" and not object files. Index file creation is already done // in addCombinedLTOObject, so we are done if that's the case. diff --git a/lld/test/COFF/tls-used-gc.s b/lld/test/COFF/tls-used-gc.s new file mode 100644 index 0000000..4736be6 --- /dev/null +++ b/lld/test/COFF/tls-used-gc.s @@ -0,0 +1,21 @@ +# 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:main /subsystem:console /opt:ref +# RUN: llvm-readobj --file-headers %t.exe | FileCheck %s + +# CHECK: TLSTableRVA: 0x1000 +# CHECK: TLSTableSize: 0x28 + + .section .text@main,"xr",one_only,main + .globl main +main: + ret + + .section .tls$aaa +tlsvar: + .long 1 + + .section .rdata$_tls_used,"dr",one_only,_tls_used + .globl _tls_used +_tls_used: + .zero 40 |