forked from OSchip/llvm-project
Correctly handle two gd relocations to the same symbol.
Fixes PR26676. llvm-svn: 261561
This commit is contained in:
parent
57b62c5e16
commit
56da313e86
|
@ -253,12 +253,13 @@ static bool handleTlsRelocation(unsigned Type, SymbolBody *Body,
|
|||
return false;
|
||||
|
||||
if (Target->isTlsGlobalDynamicRel(Type)) {
|
||||
if (!Target->canRelaxTls(Type, Body) &&
|
||||
Out<ELFT>::Got->addDynTlsEntry(Body)) {
|
||||
Out<ELFT>::RelaDyn->addReloc(
|
||||
{Target->TlsModuleIndexRel, DynamicReloc<ELFT>::Off_GTlsIndex, Body});
|
||||
Out<ELFT>::RelaDyn->addReloc(
|
||||
{Target->TlsOffsetRel, DynamicReloc<ELFT>::Off_GTlsOffset, Body});
|
||||
if (!Target->canRelaxTls(Type, Body)) {
|
||||
if (Out<ELFT>::Got->addDynTlsEntry(Body)) {
|
||||
Out<ELFT>::RelaDyn->addReloc({Target->TlsModuleIndexRel,
|
||||
DynamicReloc<ELFT>::Off_GTlsIndex, Body});
|
||||
Out<ELFT>::RelaDyn->addReloc(
|
||||
{Target->TlsOffsetRel, DynamicReloc<ELFT>::Off_GTlsOffset, Body});
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (!canBePreempted(Body, true))
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
// REQUIRES: x86
|
||||
// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
|
||||
// RUN: ld.lld %t -o %tout -shared
|
||||
// RUN: llvm-readobj -r %tout | FileCheck %s
|
||||
|
||||
data16
|
||||
leaq g_tls_s@TLSGD(%rip), %rdi
|
||||
data16
|
||||
data16
|
||||
rex64
|
||||
callq __tls_get_addr@PLT
|
||||
|
||||
data16
|
||||
leaq g_tls_s@TLSGD(%rip), %rdi
|
||||
data16
|
||||
data16
|
||||
rex64
|
||||
callq __tls_get_addr@PLT
|
||||
|
||||
// Check that we handle two gd relocations to the same symbol.
|
||||
|
||||
// CHECK: Relocations [
|
||||
// CHECK-NEXT: Section (4) .rela.dyn {
|
||||
// CHECK-NEXT: R_X86_64_DTPMOD64 g_tls_s 0x0
|
||||
// CHECK-NEXT: R_X86_64_DTPOFF64 g_tls_s 0x0
|
||||
// CHECK-NEXT: }
|
||||
// CHECK-NEXT: Section (5) .rela.plt {
|
||||
// CHECK-NEXT: R_X86_64_JUMP_SLOT __tls_get_addr 0x0
|
||||
// CHECK-NEXT: }
|
||||
// CHECK-NEXT: ]
|
Loading…
Reference in New Issue