[PATCH] D62098: [ELF] Fix getRelocTargetVA formulae of R_TLS and R_NEG_TLS
Fangrui Song via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon May 20 04:42:17 PDT 2019
MaskRay updated this revision to Diff 200254.
MaskRay edited the summary of this revision.
MaskRay added a comment.
Update description
Repository:
rLLD LLVM Linker
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D62098/new/
https://reviews.llvm.org/D62098
Files:
ELF/InputSection.cpp
test/ELF/i386-tls-le-undef.s
test/ELF/x86-64-tls-le-undef.s
Index: test/ELF/x86-64-tls-le-undef.s
===================================================================
--- /dev/null
+++ test/ELF/x86-64-tls-le-undef.s
@@ -0,0 +1,15 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
+# RUN: ld.lld --noinhibit-exec %t.o -o %t 2>&1
+# RUN: llvm-objdump -d %t | FileCheck %s
+
+## Undefined TLS symbols resolve to 0.
+## In --noinhibit-exec mode, a non-weak undefined symbol is not an error.
+
+# CHECK: leaq 16(%rax), %rdx
+# CHECK-NEXT: leaq 32(%rax), %rdx
+
+.weak weak
+movq %fs:0, %rax
+leaq weak at tpoff+16(%rax), %rdx
+leaq global at tpoff+32(%rax), %rdx
Index: test/ELF/i386-tls-le-undef.s
===================================================================
--- /dev/null
+++ test/ELF/i386-tls-le-undef.s
@@ -0,0 +1,16 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=i386 %s -o %t.o
+# RUN: ld.lld --noinhibit-exec %t.o -o %t 2>&1
+# RUN: llvm-objdump -d %t | FileCheck %s
+
+## Undefined TLS symbols resolve to 0.
+## In --noinhibit-exec mode, a non-weak undefined symbol is not an error.
+
+# CHECK: subl $0, %eax
+# CHECK: subl $0, %eax
+
+.weak weak_undef
+movl %gs:0, %eax
+subl $weak_undef at tpoff,%eax
+movl %gs:0, %eax
+subl $undef at tpoff,%eax
Index: ELF/InputSection.cpp
===================================================================
--- ELF/InputSection.cpp
+++ ELF/InputSection.cpp
@@ -738,17 +738,18 @@
case R_RELAX_TLS_IE_TO_LE:
case R_RELAX_TLS_LD_TO_LE:
case R_TLS:
- // A weak undefined TLS symbol resolves to the base of the TLS
- // block, i.e. gets a value of zero. If we pass --gc-sections to
- // lld and .tbss is not referenced, it gets reclaimed and we don't
- // create a TLS program header. Therefore, we resolve this
- // statically to zero.
- if (Sym.isTls() && Sym.isUndefWeak())
- return 0;
+ // It is not very clear what to return if the symbol is undefined. With
+ // --noinhibit-exec, even a non-weak undefined reference may reach here.
+ // Just return A, which matches R_ABS, and the behavior of some dynamic
+ // loaders.
+ if (Sym.isUndefined())
+ return A;
return Sym.getVA(A) + getTlsTpOffset();
case R_RELAX_TLS_GD_TO_LE_NEG:
case R_NEG_TLS:
- return -(Sym.getVA(A) + getTlsTpOffset());
+ if (Sym.isUndefined())
+ return A;
+ return -Sym.getVA(0) - getTlsTpOffset() + A;
case R_SIZE:
return Sym.getSize() + A;
case R_TLSDESC:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D62098.200254.patch
Type: text/x-patch
Size: 2433 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190520/b95d29c7/attachment.bin>
More information about the llvm-commits
mailing list