diff options
author | Moritz Sichert <sichert@in.tum.de> | 2023-02-08 11:47:32 +0100 |
---|---|---|
committer | Moritz Sichert <sichert@in.tum.de> | 2023-02-08 17:49:53 +0100 |
commit | cb19b83baac1a204cb61e7fd7c8f22dac886ce39 (patch) | |
tree | 4979d7a44c3870d630351e561e87676ec34b7fa0 | |
parent | e1b5014119c027bff4d2784c18d5d1fda3676f13 (diff) | |
download | llvm-cb19b83baac1a204cb61e7fd7c8f22dac886ce39.zip llvm-cb19b83baac1a204cb61e7fd7c8f22dac886ce39.tar.gz llvm-cb19b83baac1a204cb61e7fd7c8f22dac886ce39.tar.bz2 |
[RuntimeDyld][ELF] Fixed relocations referencing undefined TLS symbols
The classification of TLS symbols in ELF was changed from ST_Data to
ST_Other in the following commit:
018a484cd26d72fb4c9e7fd75e5f5bc7838dfc73
RuntimeDyldELF::processRelocationRef() needs to be updated to also
handle ST_Other symbols so that it handles TLS relocations correctly.
The current tests did not fail because we have a shortcut for global
symbols that are already defined.
Differential Revision: https://reviews.llvm.org/D143568
-rw-r--r-- | llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp | 1 | ||||
-rw-r--r-- | llvm/test/ExecutionEngine/RuntimeDyld/X86/TLS.s | 40 |
2 files changed, 39 insertions, 2 deletions
diff --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp index b9ab127..3c7f4ec 100644 --- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp +++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp @@ -1282,6 +1282,7 @@ RuntimeDyldELF::processRelocationRef( } case SymbolRef::ST_Data: case SymbolRef::ST_Function: + case SymbolRef::ST_Other: case SymbolRef::ST_Unknown: { Value.SymbolName = TargetName.data(); Value.Addend = Addend; diff --git a/llvm/test/ExecutionEngine/RuntimeDyld/X86/TLS.s b/llvm/test/ExecutionEngine/RuntimeDyld/X86/TLS.s index ed88b54..2b10592 100644 --- a/llvm/test/ExecutionEngine/RuntimeDyld/X86/TLS.s +++ b/llvm/test/ExecutionEngine/RuntimeDyld/X86/TLS.s @@ -1,8 +1,11 @@ # REQUIRES: x86_64-linux # RUN: rm -rf %t && mkdir -p %t -# RUN: llvm-mc -triple=x86_64-unknown-linux -filetype=obj -o %t/tls.o %s -# RUN: llvm-rtdyld -triple=x86_64-unknown-linux -execute %t/tls.o +# RUN: split-file %s %t +# RUN: llvm-mc -triple=x86_64-unknown-linux -filetype=obj -o %t/test_runner.o %t/test_runner.s +# RUN: llvm-mc -triple=x86_64-unknown-linux -filetype=obj -o %t/external_tls.o %t/external_tls.s +# RUN: llvm-rtdyld -triple=x86_64-unknown-linux -execute %t/test_runner.o %t/external_tls.o +#--- test_runner.s _main: @@ -130,6 +133,28 @@ _main: jmp 2f 1: +# External TLS variable, Local Exec TLS Model (small code model) + mov %fs:external_tls_var@tpoff, %eax + cmp $0x56, %eax + je 1f + mov $12, %eax + jmp 2f +1: + +# External TLS variable, Global Dynamic TLS Model (small code model) + .byte 0x66 + leaq external_tls_var@tlsgd(%rip), %rdi + .byte 0x66, 0x66, 0x48 + call __tls_get_addr@plt + mov (%rax), %eax + cmp $0x56, %eax + je 1f + mov $13, %eax + jmp 2f +1: + + +# Return 0 if all tests are successful xor %eax, %eax 2: @@ -152,3 +177,14 @@ tls_foo: .align 4 tls_bar: .long 0x34 + +#--- external_tls.s + + .section .tdata, "awT", @progbits + + .global external_tls_var + .type external_tls_var, @object + .size external_tls_var, 4 + .align 4 +external_tls_var: + .long 0x56 |