-
Notifications
You must be signed in to change notification settings - Fork 10.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[ELF] Fix getRelocTargetVA formulae of R_TLS and R_NEG_TLS
For R_TLS: 1) Delete Sym.isTls() . The assembler ensures the symbol is STT_TLS. If not (the input is broken), we would crash (dereferencing null Out::TlsPhdr). 2) Change Sym.isUndefWeak() to Sym.isUndefined(), otherwise with --noinhibit-exec we would still evaluate the symbol and crash. 3) Return A if the symbol is undefined. This is PR40570. The case is probably unrealistic but returning A matches R_ABS and the behavior of several dynamic loaders. R_NEG_TLS is obsoleted Sun TLS we don't fully support, but R_RELAX_TLS_GD_TO_LE_NEG is still used by GD->LE relaxation (subl $var@tpoff,%eax). They should add the addend. Unfortunately I can't test it as compilers don't seem to generate non-zero implicit addends. Reviewed By: ruiu Differential Revision: https://reviews.llvm.org/D62098 llvm-svn: 361146
- Loading branch information
Showing
3 changed files
with
40 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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@tpoff,%eax | ||
movl %gs:0, %eax | ||
subl $undef@tpoff,%eax |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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@tpoff+16(%rax), %rdx | ||
leaq global@tpoff+32(%rax), %rdx |