[ELF] Do not leave undefined symbols (specified by -init and -fini) if 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
This commit is contained in:
Igor Kudrin 2020-07-14 15:54:35 +07:00
parent 242a736a14
commit c4fc26b4c0
2 changed files with 10 additions and 2 deletions

View File

@ -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

View File

@ -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