parent
a3dc05b363
commit
09d5daab49
|
@ -150,6 +150,7 @@ static unsigned handleTlsRelocation(uint32_t Type, SymbolBody &Body,
|
||||||
return handleNoRelaxTlsRelocation<ELFT>(In<ELFT>::MipsGot, Type, Body, C,
|
return handleNoRelaxTlsRelocation<ELFT>(In<ELFT>::MipsGot, Type, Body, C,
|
||||||
Offset, Addend, Expr);
|
Offset, Addend, Expr);
|
||||||
|
|
||||||
|
bool IsPreemptible = isPreemptible(Body, Type);
|
||||||
if ((Expr == R_TLSDESC || Expr == R_TLSDESC_PAGE || Expr == R_TLSDESC_CALL) &&
|
if ((Expr == R_TLSDESC || Expr == R_TLSDESC_PAGE || Expr == R_TLSDESC_CALL) &&
|
||||||
Config->Shared) {
|
Config->Shared) {
|
||||||
if (In<ELFT>::Got->addDynTlsEntry(Body)) {
|
if (In<ELFT>::Got->addDynTlsEntry(Body)) {
|
||||||
|
@ -195,7 +196,7 @@ static unsigned handleTlsRelocation(uint32_t Type, SymbolBody &Body,
|
||||||
// If the symbol is preemptible we need the dynamic linker to write
|
// If the symbol is preemptible we need the dynamic linker to write
|
||||||
// the offset too.
|
// the offset too.
|
||||||
uintX_t OffsetOff = Off + (uintX_t)sizeof(uintX_t);
|
uintX_t OffsetOff = Off + (uintX_t)sizeof(uintX_t);
|
||||||
if (isPreemptible(Body, Type))
|
if (IsPreemptible)
|
||||||
In<ELFT>::RelaDyn->addReloc({Target->TlsOffsetRel, In<ELFT>::Got,
|
In<ELFT>::RelaDyn->addReloc({Target->TlsOffsetRel, In<ELFT>::Got,
|
||||||
OffsetOff, false, &Body, 0});
|
OffsetOff, false, &Body, 0});
|
||||||
else
|
else
|
||||||
|
@ -208,7 +209,7 @@ static unsigned handleTlsRelocation(uint32_t Type, SymbolBody &Body,
|
||||||
|
|
||||||
// Global-Dynamic relocs can be relaxed to Initial-Exec or Local-Exec
|
// Global-Dynamic relocs can be relaxed to Initial-Exec or Local-Exec
|
||||||
// depending on the symbol being locally defined or not.
|
// depending on the symbol being locally defined or not.
|
||||||
if (isPreemptible(Body, Type)) {
|
if (IsPreemptible) {
|
||||||
C.Relocations.push_back(
|
C.Relocations.push_back(
|
||||||
{Target->adjustRelaxExpr(Type, nullptr, R_RELAX_TLS_GD_TO_IE), Type,
|
{Target->adjustRelaxExpr(Type, nullptr, R_RELAX_TLS_GD_TO_IE), Type,
|
||||||
Offset, Addend, &Body});
|
Offset, Addend, &Body});
|
||||||
|
@ -228,8 +229,7 @@ static unsigned handleTlsRelocation(uint32_t Type, SymbolBody &Body,
|
||||||
|
|
||||||
// Initial-Exec relocs can be relaxed to Local-Exec if the symbol is locally
|
// Initial-Exec relocs can be relaxed to Local-Exec if the symbol is locally
|
||||||
// defined.
|
// defined.
|
||||||
if (Target->isTlsInitialExecRel(Type) && !Config->Shared &&
|
if (Target->isTlsInitialExecRel(Type) && !Config->Shared && !IsPreemptible) {
|
||||||
!isPreemptible(Body, Type)) {
|
|
||||||
C.Relocations.push_back(
|
C.Relocations.push_back(
|
||||||
{R_RELAX_TLS_IE_TO_LE, Type, Offset, Addend, &Body});
|
{R_RELAX_TLS_IE_TO_LE, Type, Offset, Addend, &Body});
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in New Issue