Index: ELF/SyntheticSections.cpp =================================================================== --- ELF/SyntheticSections.cpp +++ ELF/SyntheticSections.cpp @@ -1762,19 +1762,19 @@ size_t NumLocals = E - Symbols.begin(); getParent()->Info = NumLocals + 1; - // Assign the growing unique ID for each local symbol's file. - DenseMap FileIDs; - for (auto I = Symbols.begin(); I != E; ++I) - FileIDs.insert({I->Sym->File, FileIDs.size()}); - - // Sort the local symbols to group them by file. We do not need to care about - // the STT_FILE symbols, they are already naturally placed first in each group. - // That happens because STT_FILE is always the first symbol in the object and - // hence precede all other local symbols we add for a file. - std::stable_sort(Symbols.begin(), E, - [&](const SymbolTableEntry &L, const SymbolTableEntry &R) { - return FileIDs[L.Sym->File] < FileIDs[R.Sym->File]; - }); + // We want to group the local symbols by file. For that we rebuild the local + // part of the symbols vector. We do not need to care about the STT_FILE + // symbols, they are already naturally placed first in each group. That + // happens because STT_FILE is always the first symbol in the object and hence + // precede all other local symbols we add for a file. + MapVector> Arr; + for (const SymbolTableEntry &S : llvm::make_range(Symbols.begin(), E)) + Arr[S.Sym->File].push_back(S); + + auto I = Symbols.begin(); + for (std::pair> &P : Arr) + for (SymbolTableEntry &Entry : P.second) + *I++ = Entry; } void SymbolTableBaseSection::addSymbol(Symbol *B) {