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/archive-init-fini.s =================================================================== --- /dev/null +++ lld/test/ELF/archive-init-fini.s @@ -0,0 +1,16 @@ +# REQUIRES: x86 + +## This checks that LLD does not add "_init" and "_fini" symbols into +## the symbol table of the output binary if the symbols are encountered in +## an archive but not in fact used in input files. + +# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t +# RUN: rm -f %t.a +# RUN: llvm-ar rcs %t.a %t +# RUN: ld.lld -shared -m elf_x86_64 %t.a -o %t.out +# RUN: llvm-nm %t.out | \ +# RUN: FileCheck %s --implicit-check-not=_init --implicit-check-not=_fini + +.global _init, _fini +_init: +_fini: