forked from OSchip/llvm-project
parent
f53b1b7fde
commit
c7b073a23a
|
@ -239,14 +239,13 @@ bool RelocationSection<ELFT>::applyTlsDynamicReloc(SymbolBody *Body,
|
|||
}
|
||||
|
||||
template <class ELFT> void RelocationSection<ELFT>::writeTo(uint8_t *Buf) {
|
||||
const unsigned EntrySize = IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel);
|
||||
for (const DynamicReloc<ELFT> &Rel : Relocs) {
|
||||
auto *P = reinterpret_cast<Elf_Rel *>(Buf);
|
||||
Buf += EntrySize;
|
||||
Buf += IsRela ? sizeof(Elf_Rela) : sizeof(Elf_Rel);
|
||||
|
||||
// Skip placeholder for global dynamic TLS relocation pair. It was already
|
||||
// handled by the previous relocation.
|
||||
if (!Rel.C || !Rel.RI)
|
||||
if (!Rel.C)
|
||||
continue;
|
||||
|
||||
InputSectionBase<ELFT> &C = *Rel.C;
|
||||
|
@ -262,16 +261,16 @@ template <class ELFT> void RelocationSection<ELFT>::writeTo(uint8_t *Buf) {
|
|||
continue;
|
||||
bool NeedsCopy = Body && Target->needsCopyRel(Type, *Body);
|
||||
bool NeedsGot = Body && Target->relocNeedsGot(Type, *Body);
|
||||
bool CanBePreempted = canBePreempted(Body, NeedsGot);
|
||||
bool CBP = canBePreempted(Body, NeedsGot);
|
||||
bool LazyReloc = Body && Target->supportsLazyRelocations() &&
|
||||
Target->relocNeedsPlt(Type, *Body);
|
||||
bool IsDynRelative = Type == Target->getRelativeReloc();
|
||||
|
||||
unsigned Sym = CanBePreempted ? Body->DynamicSymbolTableIndex : 0;
|
||||
unsigned Sym = CBP ? Body->DynamicSymbolTableIndex : 0;
|
||||
unsigned Reloc;
|
||||
if (!CanBePreempted && Body && isGnuIFunc<ELFT>(*Body))
|
||||
if (!CBP && Body && isGnuIFunc<ELFT>(*Body))
|
||||
Reloc = Target->getIRelativeReloc();
|
||||
else if (!CanBePreempted || IsDynRelative)
|
||||
else if (!CBP || IsDynRelative)
|
||||
Reloc = Target->getRelativeReloc();
|
||||
else if (LazyReloc)
|
||||
Reloc = Target->getPltReloc();
|
||||
|
@ -289,7 +288,7 @@ template <class ELFT> void RelocationSection<ELFT>::writeTo(uint8_t *Buf) {
|
|||
P->r_offset = Out<ELFT>::Got->getEntryAddr(*Body);
|
||||
else if (NeedsCopy)
|
||||
P->r_offset = Out<ELFT>::Bss->getVA() +
|
||||
dyn_cast<SharedSymbol<ELFT>>(Body)->OffsetInBss;
|
||||
cast<SharedSymbol<ELFT>>(Body)->OffsetInBss;
|
||||
else
|
||||
P->r_offset = C.getOffset(RI.r_offset) + C.OutSec->getVA();
|
||||
|
||||
|
@ -300,7 +299,7 @@ template <class ELFT> void RelocationSection<ELFT>::writeTo(uint8_t *Buf) {
|
|||
uintX_t Addend;
|
||||
if (NeedsCopy)
|
||||
Addend = 0;
|
||||
else if (CanBePreempted || IsDynRelative)
|
||||
else if (CBP || IsDynRelative)
|
||||
Addend = OrigAddend;
|
||||
else if (Body)
|
||||
Addend = getSymVA<ELFT>(*Body) + OrigAddend;
|
||||
|
|
Loading…
Reference in New Issue