Index: lld/trunk/ELF/OutputSections.h =================================================================== --- lld/trunk/ELF/OutputSections.h +++ lld/trunk/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: lld/trunk/ELF/OutputSections.cpp =================================================================== --- lld/trunk/ELF/OutputSections.cpp +++ lld/trunk/ELF/OutputSections.cpp @@ -90,14 +90,22 @@ } template void GotSection::addEntry(SymbolBody &Sym) { + if (Config->EMachine == EM_MIPS) { + if (Sym.isPreemptible()) + // All symbols with MIPS GOT entries should be represented + // in the dynamic symbols table. See "Global Offset Table" in Chapter 5: + // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf + Sym.MustBeInDynSym = true; + else { + // 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: lld/trunk/ELF/Writer.cpp =================================================================== --- lld/trunk/ELF/Writer.cpp +++ lld/trunk/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)) { @@ -407,15 +399,13 @@ continue; Out::Got->addEntry(Body); - if (Config->EMachine == EM_MIPS) { + if (Config->EMachine == EM_MIPS) // MIPS ABI has special rules to process GOT entries // and doesn't require relocation entries for them. // 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; continue; - } bool Dynrel = Config->Pic && !Target->isRelRelative(Type) && !Target->isSizeRel(Type);