ELF: Move GNU_IFUNC relocation handler to one place. NFC.

llvm-svn: 259468
This commit is contained in:
Rui Ueyama 2016-02-02 06:29:10 +00:00
parent 6d3874b995
commit 343f7e5d8d
1 changed files with 18 additions and 9 deletions

View File

@ -306,6 +306,24 @@ void Writer<ELFT>::scanRelocs(
}
}
// An STT_GNU_IFUNC symbol always uses a PLT entry, and all references
// to the symbol go through the PLT. This is true even for a local
// symbol, although local symbols normally do not require PLT entries.
if (Body && isGnuIFunc<ELFT>(*Body)) {
Body->setUsedInDynamicReloc();
if (Body->isInGot())
continue;
Out<ELFT>::Plt->addEntry(Body);
if (Target->UseLazyBinding) {
Out<ELFT>::GotPlt->addEntry(Body);
Out<ELFT>::RelaPlt->addReloc({&C, &RI});
} else {
Out<ELFT>::Got->addEntry(Body);
Out<ELFT>::RelaDyn->addReloc({&C, &RI});
}
continue;
}
bool NeedsGot = false;
bool NeedsPlt = false;
@ -328,15 +346,6 @@ void Writer<ELFT>::scanRelocs(
}
}
// An STT_GNU_IFUNC symbol always uses a PLT entry, and all references
// to the symbol go through the PLT. This is true even for a local
// symbol, although local symbols normally do not require PLT entries.
if (Body && isGnuIFunc<ELFT>(*Body)) {
Body->setUsedInDynamicReloc();
Out<ELFT>::RelaPlt->addReloc({&C, &RI});
continue;
}
if (Config->EMachine == EM_MIPS) {
if (Type == R_MIPS_LO16)
// Ignore R_MIPS_LO16 relocation. If it is a pair for R_MIPS_GOT16 we