diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp --- a/lld/COFF/Driver.cpp +++ b/lld/COFF/Driver.cpp @@ -74,6 +74,11 @@ lld::stdoutOS = &stdoutOS; lld::stderrOS = &stderrOS; + ObjFile::instances.clear(); + ImportFile::instances.clear(); + BitcodeFile::instances.clear(); + memset(MergeChunk::instances, 0, sizeof(MergeChunk::instances)); + config = make(); symtab = make(); driver = make(); @@ -85,10 +90,6 @@ exitLld(errorCount() ? 1 : 0); freeArena(); - ObjFile::instances.clear(); - ImportFile::instances.clear(); - BitcodeFile::instances.clear(); - memset(MergeChunk::instances, 0, sizeof(MergeChunk::instances)); return !errorCount(); } diff --git a/lld/COFF/InputFiles.cpp b/lld/COFF/InputFiles.cpp --- a/lld/COFF/InputFiles.cpp +++ b/lld/COFF/InputFiles.cpp @@ -69,9 +69,9 @@ namespace coff { -std::vector ObjFile::instances; -std::vector ImportFile::instances; -std::vector BitcodeFile::instances; +std::vector ObjFile::instances = {nullptr}; +std::vector ImportFile::instances = {nullptr}; +std::vector BitcodeFile::instances = {nullptr}; /// Checks that Source is compatible with being a weak alias to Target. /// If Source is Undefined and has no weak alias set, makes it a weak diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -82,7 +82,7 @@ // Global vector of all output sections. After output sections are finalized, // this can be indexed by Chunk::getOutputSection. -static std::vector outputSections; +static std::vector outputSections = {nullptr}; OutputSection *Chunk::getOutputSection() const { return osidx == 0 ? nullptr : outputSections[osidx - 1]; @@ -588,6 +588,7 @@ void Writer::run() { ScopedTimer t1(codeLayoutTimer); + outputSections.clear(); createImportTables(); createSections(); createMiscChunks(); diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -91,6 +91,7 @@ outputSections.clear(); binaryFiles.clear(); bitcodeFiles.clear(); + lazyObjFiles.clear(); objectFiles.clear(); sharedFiles.clear(); diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -55,11 +55,16 @@ namespace elf { bool InputFile::isInGroup; uint32_t InputFile::nextGroupId; -std::vector binaryFiles; -std::vector bitcodeFiles; -std::vector lazyObjFiles; -std::vector objectFiles; -std::vector sharedFiles; + +// These containers are initialized with invalid values to make sure +// that we clear them before use. Clearing them on every linker +// invocation is needed to allow users call lld's main function more +// than once. +std::vector binaryFiles = {nullptr}; +std::vector bitcodeFiles = {nullptr}; +std::vector lazyObjFiles = {nullptr}; +std::vector objectFiles = {nullptr}; +std::vector sharedFiles = {nullptr}; std::unique_ptr tar; diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp --- a/lld/ELF/InputSection.cpp +++ b/lld/ELF/InputSection.cpp @@ -44,7 +44,7 @@ } namespace elf { -std::vector inputSections; +std::vector inputSections = {nullptr}; template static ArrayRef getSectionContents(ObjFile &file,