summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Writer.cpp44
1 files changed, 26 insertions, 18 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index a09a570384f..1371a96236d 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -324,25 +324,36 @@ void Writer<ELFT>::scanRelocs(
continue;
}
- bool NeedsGot = false;
- bool NeedsPlt = false;
+ // If a relocation needs PLT, we create a PLT and a GOT slot
+ // for the symbol.
+ if (Body && Target->needsPlt(Type, *Body)) {
+ if (Body->isInPlt())
+ continue;
+ Out<ELFT>::Plt->addEntry(Body);
- if (Body) {
- NeedsPlt = Target->needsPlt(Type, *Body);
- if (NeedsPlt) {
- if (Body->isInPlt())
+ if (Target->UseLazyBinding) {
+ Out<ELFT>::GotPlt->addEntry(Body);
+ Out<ELFT>::RelaPlt->addReloc({&C, &RI});
+ } else {
+ if (Body->isInGot())
continue;
- Out<ELFT>::Plt->addEntry(Body);
+ Out<ELFT>::Got->addEntry(Body);
+ Out<ELFT>::RelaDyn->addReloc({&C, &RI});
}
+
+ if (canBePreempted(Body, /*NeedsGot=*/true))
+ Body->setUsedInDynamicReloc();
+ continue;
+ }
+
+ bool NeedsGot = false;
+
+ if (Body) {
NeedsGot = Target->needsGot(Type, *Body);
if (NeedsGot) {
- if (NeedsPlt && Target->UseLazyBinding) {
- Out<ELFT>::GotPlt->addEntry(Body);
- } else {
- if (Body->isInGot())
- continue;
- Out<ELFT>::Got->addEntry(Body);
- }
+ if (Body->isInGot())
+ continue;
+ Out<ELFT>::Got->addEntry(Body);
}
}
@@ -383,10 +394,7 @@ void Writer<ELFT>::scanRelocs(
if (CBP)
Body->setUsedInDynamicReloc();
- if (NeedsPlt && Target->UseLazyBinding)
- Out<ELFT>::RelaPlt->addReloc({&C, &RI});
- else
- Out<ELFT>::RelaDyn->addReloc({&C, &RI});
+ Out<ELFT>::RelaDyn->addReloc({&C, &RI});
}
}
OpenPOWER on IntegriCloud