diff options
-rw-r--r-- | lld/ELF/Target.cpp | 6 | ||||
-rw-r--r-- | lld/ELF/Target.h | 1 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 2 |
3 files changed, 2 insertions, 7 deletions
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 48c5f6aa731..98c7a255a4c 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -84,7 +84,6 @@ public: int32_t Index, unsigned RelOff) const override; bool isRelRelative(uint32_t Type) const override; bool needsCopyRelImpl(uint32_t Type) const override; - bool needsDynRelative(uint32_t Type) const override; bool needsPltImpl(uint32_t Type) const override; void relocateOne(uint8_t *Loc, uint32_t Type, uint64_t Val) const override; @@ -510,10 +509,6 @@ void X86TargetInfo::relocateOne(uint8_t *Loc, uint32_t Type, write32le(Loc, Val); } -bool X86TargetInfo::needsDynRelative(uint32_t Type) const { - return Config->Shared && Type == R_386_TLS_IE; -} - void X86TargetInfo::relaxTlsGdToLe(uint8_t *Loc, uint32_t Type, uint64_t Val) const { // GD can be optimized to LE: @@ -1166,6 +1161,7 @@ bool AArch64TargetInfo::isRelRelative(uint32_t Type) const { case R_AARCH64_TLSLE_ADD_TPREL_HI12: case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: case R_AARCH64_TSTBR14: + case R_AARCH64_LD64_GOT_LO12_NC: return true; } } diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h index 7b461ea21fc..b8e6ea32ba7 100644 --- a/lld/ELF/Target.h +++ b/lld/ELF/Target.h @@ -55,7 +55,6 @@ public: // dynamic linker if isRelRelative returns true. virtual bool isRelRelative(uint32_t Type) const; - virtual bool needsDynRelative(uint32_t Type) const { return false; } virtual bool refersToGotEntry(uint32_t Type) const; enum PltNeed { Plt_No, Plt_Explicit, Plt_Implicit }; diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 71b2664baac..9cbe4ff12e2 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -501,7 +501,7 @@ void Writer<ELFT>::scanRelocs(InputSectionBase<ELFT> &C, ArrayRef<RelTy> Rels) { continue; } - if (Target->needsDynRelative(Type)) + if (Expr == R_GOT && !Target->isRelRelative(Type) && Config->Shared) AddDyn({Target->RelativeRel, C.OutSec, Offset, true, &Body, getAddend<ELFT>(RI)}); |