diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp --- a/lld/ELF/Driver.cpp +++ b/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 diff --git a/lld/test/ELF/init-fini.s b/lld/test/ELF/init-fini.s --- a/lld/test/ELF/init-fini.s +++ b/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