Skip to content

Commit

Permalink
[ELF] Do not leave undefined symbols (specified by -init and -fini) i…
Browse files Browse the repository at this point in the history
…f they are defined in non-fetched archive members

After D69985, symbols for "-init" and "-fini" were unconditionally
marked as used even if they were just lazy symbols seen when scanning
archives. That resulted in exposing them in the symbol table of an
output file, as Undefined, which added unwanted dependencies. The patch
fixes the issue by checking the kind of the symbols before the marking.

Differential Revision: https://reviews.llvm.org/D83549
  • Loading branch information
igorkudrin committed Jul 14, 2020
1 parent 242a736 commit c4fc26b
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 2 deletions.
4 changes: 2 additions & 2 deletions lld/ELF/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1944,9 +1944,9 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &args) {
handleUndefinedGlob(pat);

// Mark -init and -fini symbols so that the LTO doesn't eliminate them.
if (Symbol *sym = symtab->find(config->init))
if (Symbol *sym = dyn_cast_or_null<Defined>(symtab->find(config->init)))
sym->isUsedInRegularObj = true;
if (Symbol *sym = symtab->find(config->fini))
if (Symbol *sym = dyn_cast_or_null<Defined>(symtab->find(config->fini)))
sym->isUsedInRegularObj = true;

// If any of our inputs are bitcode files, the LTO code generator may create
Expand Down
8 changes: 8 additions & 0 deletions lld/test/ELF/init-fini.s
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,14 @@
// NOENTRY-NOT: Name: _unknown
// NOENTRY: ]

// Should not add entries for "_init" and "_fini" to the symbol table
// if the symbols are defined in non-fetched achive members.
// RUN: rm -f %t.a
// RUN: llvm-ar rcs %t.a %t
// RUN: ld.lld -shared -m elf_x86_64 -e _unknown %t.a -o %t.so
// RUN: llvm-nm %t.so | \
// RUN: FileCheck %s --implicit-check-not=_init --implicit-check-not=_fini

.global _start,_init,_fini,_foo,_bar,_undef
_start:
_init = 0x11010
Expand Down

0 comments on commit c4fc26b

Please sign in to comment.