Index: lld/trunk/ELF/Driver.cpp =================================================================== --- lld/trunk/ELF/Driver.cpp +++ lld/trunk/ELF/Driver.cpp @@ -168,8 +168,6 @@ } void LinkerDriver::main(ArrayRef ArgsArr) { - initSymbols(); - opt::InputArgList Args = parseArgs(&Alloc, ArgsArr.slice(1)); if (Args.hasArg(OPT_help)) { printHelp(ArgsArr[0]); @@ -317,6 +315,7 @@ } template void LinkerDriver::link(opt::InputArgList &Args) { + initSymbols(); // For LTO InitializeAllTargets(); InitializeAllTargetMCs(); Index: lld/trunk/ELF/Symbols.h =================================================================== --- lld/trunk/ELF/Symbols.h +++ lld/trunk/ELF/Symbols.h @@ -41,8 +41,7 @@ template class SharedFile; // Initializes global objects defined in this file. -// Called at the beginning of main(). -void initSymbols(); +template void initSymbols(); // Returns a demangled C++ symbol name. If Name is not a mangled // name or the system does not provide __cxa_demangle function, Index: lld/trunk/ELF/Symbols.cpp =================================================================== --- lld/trunk/ELF/Symbols.cpp +++ lld/trunk/ELF/Symbols.cpp @@ -209,7 +209,7 @@ return createObjectFile(MBRef, File->getName()); } -template static void doInitSymbols() { +template void elf::initSymbols() { ElfSym::Etext.setBinding(STB_GLOBAL); ElfSym::Edata.setBinding(STB_GLOBAL); ElfSym::End.setBinding(STB_GLOBAL); @@ -217,13 +217,6 @@ ElfSym::Ignored.setVisibility(STV_HIDDEN); } -void elf::initSymbols() { - doInitSymbols(); - doInitSymbols(); - doInitSymbols(); - doInitSymbols(); -} - // Returns the demangled C++ symbol name for Name. std::string elf::demangle(StringRef Name) { #if !defined(HAVE_CXXABI_H) @@ -289,3 +282,8 @@ template class elf::DefinedSynthetic; template class elf::DefinedSynthetic; template class elf::DefinedSynthetic; + +template void elf::initSymbols(); +template void elf::initSymbols(); +template void elf::initSymbols(); +template void elf::initSymbols();