Index: lld/ELF/Driver.cpp =================================================================== --- lld/ELF/Driver.cpp +++ lld/ELF/Driver.cpp @@ -1944,9 +1944,9 @@ 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(symtab->find(config->init))) sym->isUsedInRegularObj = true; - if (Symbol *sym = symtab->find(config->fini)) + if (Symbol *sym = dyn_cast_or_null(symtab->find(config->fini))) sym->isUsedInRegularObj = true; // If any of our inputs are bitcode files, the LTO code generator may create Index: lld/test/ELF/init-fini.s =================================================================== --- lld/test/ELF/init-fini.s +++ lld/test/ELF/init-fini.s @@ -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