mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-14 14:55:41 +00:00
Pull in r345002 from upstream lld trunk:
Don't mess up RelIplt symbols during relocatable processing Summary: During upgrading of the FreeBSD source tree with lld 7.0.0, I noticed that it started complaining about crt1.o having an "index past the end of the symbol table". Such a symbol table looks approximately like this, viewed with readelf -s (note the Ndx field being messed up): Symbol table '.symtab' contains 4 entries: Num: Value Size Type Bind Vis Ndx Name 0: 00000000 0 NOTYPE LOCAL DEFAULT UND 1: 00000000 0 SECTION LOCAL DEFAULT 1 2: 00000000 0 NOTYPE WEAK HIDDEN RSV[0xffff] __rel_iplt_end 3: 00000000 0 NOTYPE WEAK HIDDEN RSV[0xffff] __rel_iplt_start At first, it seemed that recent ifunc relocation work had caused this: <https://reviews.freebsd.org/rS339351>, but it turned out that it was due to incorrect processing of the object files by lld, when using -r (a.k.a. --relocatable). Bisecting showed that rL324421 ("Convert a use of Config->Static") was the commit where this new behavior began. Simply reverting it solved the issue, and the __rel_iplt symbols had an index of UND again. Looking at Rafael's commit message, I think he simply missed the possibility of --relocatable being in effect, so I have added an additional check for it. I also added a simple regression test case. Reviewers: grimar, ruiu, emaste, espindola Reviewed By: ruiu Subscribers: arichardson, krytarowski, llvm-commits Differential Revision: https://reviews.llvm.org/D53515 This fixes a problem in lld where it places incorrect indexes for ifunc related symbols in crt1.o and friends, making it impossible to link most normal programs with it.
This commit is contained in:
parent
f3e1dfebeb
commit
950f620367
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/projects/clang700-import/; revision=339669
@ -874,7 +874,7 @@ void PhdrEntry::add(OutputSection *Sec) {
|
||||
// need these symbols, since IRELATIVE relocs are resolved through GOT
|
||||
// and PLT. For details, see http://www.airs.com/blog/archives/403.
|
||||
template <class ELFT> void Writer<ELFT>::addRelIpltSymbols() {
|
||||
if (needsInterpSection())
|
||||
if (Config->Relocatable || needsInterpSection())
|
||||
return;
|
||||
StringRef S = Config->IsRela ? "__rela_iplt_start" : "__rel_iplt_start";
|
||||
addOptionalRegular(S, InX::RelaIplt, 0, STV_HIDDEN, STB_WEAK);
|
||||
|
Loading…
Reference in New Issue
Block a user