This is an archive of the discontinued LLVM Phabricator instance.

Don't mess up RelIplt symbols during relocatable processing
ClosedPublic

Authored by dim on Oct 22 2018, 11:05 AM.

Details

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.

Diff Detail

Repository
rLLD LLVM Linker

Event Timeline

dim created this revision.Oct 22 2018, 11:05 AM
ruiu accepted this revision.Oct 22 2018, 2:07 PM

LGTM

Thank you for fixing this!

This revision is now accepted and ready to land.Oct 22 2018, 2:07 PM
This revision was automatically updated to reflect the committed changes.