forked from OSchip/llvm-project
[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:
parent
242a736a14
commit
c4fc26b4c0
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue