Correctly handle two gd relocations to the same symbol.

Fixes PR26676.

llvm-svn: 261561
This commit is contained in:
Rafael Espindola 2016-02-22 19:57:55 +00:00
parent 57b62c5e16
commit 56da313e86
2 changed files with 37 additions and 6 deletions

View File

@ -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))

View File

@ -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: ]