summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/InputSection.cpp3
-rw-r--r--lld/ELF/Target.cpp10
-rw-r--r--lld/ELF/Target.h2
3 files changed, 3 insertions, 12 deletions
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index 1098105c50d..dd5eb310387 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -148,9 +148,6 @@ void InputSectionBase<ELFT>::relocate(
SymVA = Out<ELFT>::Got->getEntryAddr(Body);
Type = Body.isTLS() ? Target->getTlsGotReloc()
: Target->getGotRefReloc(Type);
- } else if (Target->relocPointsToGot(Type)) {
- SymVA = Out<ELFT>::Got->getVA();
- Type = Target->getPCRelReloc();
} else if (!Target->relocNeedsCopy(Type, Body) &&
isa<SharedSymbol<ELFT>>(Body)) {
continue;
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp
index 20ec1f9c644..33cea220a37 100644
--- a/lld/ELF/Target.cpp
+++ b/lld/ELF/Target.cpp
@@ -53,7 +53,6 @@ public:
uint64_t PltEntryAddr, int32_t Index) const override;
bool relocNeedsCopy(uint32_t Type, const SymbolBody &S) const override;
bool relocNeedsGot(uint32_t Type, const SymbolBody &S) const override;
- bool relocPointsToGot(uint32_t Type) const override;
bool relocNeedsPlt(uint32_t Type, const SymbolBody &S) const override;
void relocateOne(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type, uint64_t P,
uint64_t SA) const override;
@@ -166,8 +165,6 @@ unsigned TargetInfo::getGotRefReloc(unsigned Type) const { return GotRefReloc; }
unsigned TargetInfo::getPltRefReloc(unsigned Type) const { return PCRelReloc; }
-bool TargetInfo::relocPointsToGot(uint32_t Type) const { return false; }
-
bool TargetInfo::isRelRelative(uint32_t Type) const { return true; }
void TargetInfo::relocateTlsOptimize(uint8_t *Loc, uint8_t *BufEnd, uint64_t P,
@@ -209,10 +206,6 @@ bool X86TargetInfo::relocNeedsGot(uint32_t Type, const SymbolBody &S) const {
return Type == R_386_GOT32 || relocNeedsPlt(Type, S);
}
-bool X86TargetInfo::relocPointsToGot(uint32_t Type) const {
- return Type == R_386_GOTPC;
-}
-
bool X86TargetInfo::relocNeedsPlt(uint32_t Type, const SymbolBody &S) const {
return Type == R_386_PLT32 || (Type == R_386_PC32 && S.isShared());
}
@@ -223,6 +216,9 @@ void X86TargetInfo::relocateOne(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type,
case R_386_GOT32:
add32le(Loc, SA - Out<ELF32LE>::Got->getVA());
break;
+ case R_386_GOTPC:
+ add32le(Loc, SA + Out<ELF32LE>::Got->getVA() - P);
+ break;
case R_386_PC32:
add32le(Loc, SA - P);
break;
diff --git a/lld/ELF/Target.h b/lld/ELF/Target.h
index 50b16bfdae2..c8b75425a6c 100644
--- a/lld/ELF/Target.h
+++ b/lld/ELF/Target.h
@@ -24,7 +24,6 @@ public:
unsigned getPageSize() const { return PageSize; }
uint64_t getVAStart() const;
unsigned getCopyReloc() const { return CopyReloc; }
- unsigned getPCRelReloc() const { return PCRelReloc; }
unsigned getGotReloc() const { return GotReloc; }
unsigned getPltReloc() const { return PltReloc; }
unsigned getRelativeReloc() const { return RelativeReloc; }
@@ -55,7 +54,6 @@ public:
virtual bool isRelRelative(uint32_t Type) const;
virtual bool relocNeedsCopy(uint32_t Type, const SymbolBody &S) const;
virtual bool relocNeedsGot(uint32_t Type, const SymbolBody &S) const = 0;
- virtual bool relocPointsToGot(uint32_t Type) const;
virtual bool relocNeedsPlt(uint32_t Type, const SymbolBody &S) const = 0;
virtual void relocateOne(uint8_t *Loc, uint8_t *BufEnd, uint32_t Type,
uint64_t P, uint64_t SA) const = 0;
OpenPOWER on IntegriCloud