Index: ELF/OutputSections.h =================================================================== --- ELF/OutputSections.h +++ ELF/OutputSections.h @@ -100,7 +100,6 @@ void finalize() override; void writeTo(uint8_t *Buf) override; void addEntry(SymbolBody &Sym); - void addMipsLocalEntry(); bool addDynTlsEntry(SymbolBody &Sym); bool addTlsIndex(); bool empty() const { return MipsLocalEntries == 0 && Entries.empty(); } Index: ELF/OutputSections.cpp =================================================================== --- ELF/OutputSections.cpp +++ ELF/OutputSections.cpp @@ -90,14 +90,15 @@ } template void GotSection::addEntry(SymbolBody &Sym) { + if (Config->EMachine == EM_MIPS && (Sym.isLocal() || !Sym.isPreemptible())) { + // FIXME (simon): Do not add so many redundant entries. + ++MipsLocalEntries; + return; + } Sym.GotIndex = Entries.size(); Entries.push_back(&Sym); } -template void GotSection::addMipsLocalEntry() { - ++MipsLocalEntries; -} - template bool GotSection::addDynTlsEntry(SymbolBody &Sym) { if (Sym.hasGlobalDynIndex()) return false; Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -335,14 +335,6 @@ Out::RelaDyn->addReloc({Target->RelativeRel, &C, RI.r_offset, true, &Body, getAddend(RI)}); - // MIPS has a special rule to create GOTs for local symbols. - if (Config->EMachine == EM_MIPS && !Preemptible && - Target->needsGot(Type, Body)) { - // FIXME (simon): Do not add so many redundant entries. - Out::Got->addMipsLocalEntry(); - continue; - } - // If a symbol in a DSO is referenced directly instead of through GOT, // we need to create a copy relocation for the symbol. if (auto *B = dyn_cast>(&Body)) { @@ -413,7 +405,8 @@ // See "Global Offset Table" in Chapter 5 in the following document // for detailed description: // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf - Body.MustBeInDynSym = true; + if (Body.isPreemptible()) + Body.MustBeInDynSym = true; continue; }