Index: ELF/Driver.cpp =================================================================== --- ELF/Driver.cpp +++ ELF/Driver.cpp @@ -33,6 +33,8 @@ LinkerDriver *elf::Driver; bool elf::link(ArrayRef Args, raw_ostream &Error) { + initSymbols(); + HasError = false; ErrorOS = &Error; Configuration C; @@ -318,14 +320,6 @@ error("no input files."); } -template static void initSymbols() { - ElfSym::Etext.setBinding(STB_GLOBAL); - ElfSym::Edata.setBinding(STB_GLOBAL); - ElfSym::End.setBinding(STB_GLOBAL); - ElfSym::Ignored.setBinding(STB_WEAK); - ElfSym::Ignored.setVisibility(STV_HIDDEN); -} - template void LinkerDriver::link(opt::InputArgList &Args) { // For LTO InitializeAllTargets(); @@ -333,8 +327,6 @@ InitializeAllAsmPrinters(); InitializeAllAsmParsers(); - initSymbols(); - SymbolTable Symtab; std::unique_ptr TI(createTarget()); Target = TI.get(); Index: ELF/Symbols.h =================================================================== --- ELF/Symbols.h +++ ELF/Symbols.h @@ -32,6 +32,10 @@ template class OutputSectionBase; template class SharedFile; +// Initializes global objects defined in this file. +// Called at the beginning of main(). +void initSymbols(); + // Returns a demangled C++ symbol name. If Name is not a mangled // name or the system does not provide __cxa_demangle function, // it returns the unmodified string. Index: ELF/Symbols.cpp =================================================================== --- ELF/Symbols.cpp +++ ELF/Symbols.cpp @@ -257,6 +257,21 @@ return createObjectFile(MBRef, File->getName()); } +template static void doInitSymbols() { + ElfSym::Etext.setBinding(STB_GLOBAL); + ElfSym::Edata.setBinding(STB_GLOBAL); + ElfSym::End.setBinding(STB_GLOBAL); + ElfSym::Ignored.setBinding(STB_WEAK); + 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)