Author: dim Date: Wed Mar 18 20:28:26 2020 New Revision: 359084 URL: https://svnweb.freebsd.org/changeset/base/359084
Log: Merge commit 00925aadb from llvm git (by Fangrui Song): [ELF][PPC32] Fix canonical PLTs when the order does not match the PLT order Reviewed By: Bdragon28 Differential Revision: https://reviews.llvm.org/D75394 This is needed to fix miscompiled canonical PLTs on ppc32/lld10. Requested by: bdragon MFC after: 6 weeks X-MFC-With: 358851 Differential Revision: https://reviews.freebsd.org/D24109 Modified: head/contrib/llvm-project/lld/ELF/Arch/PPC.cpp head/contrib/llvm-project/lld/ELF/Relocations.cpp head/contrib/llvm-project/lld/ELF/SyntheticSections.cpp head/contrib/llvm-project/lld/ELF/SyntheticSections.h head/contrib/llvm-project/lld/ELF/Writer.cpp Modified: head/contrib/llvm-project/lld/ELF/Arch/PPC.cpp ============================================================================== --- head/contrib/llvm-project/lld/ELF/Arch/PPC.cpp Wed Mar 18 20:12:46 2020 (r359083) +++ head/contrib/llvm-project/lld/ELF/Arch/PPC.cpp Wed Mar 18 20:28:26 2020 (r359084) @@ -71,12 +71,11 @@ void writePPC32GlinkSection(uint8_t *buf, size_t numEn // non-GOT-non-PLT relocations referencing external functions for -fpie/-fPIE. uint32_t glink = in.plt->getVA(); // VA of .glink if (!config->isPic) { - for (const Symbol *sym : in.plt->entries) - if (sym->needsPltAddr) { - writePPC32PltCallStub(buf, sym->getGotPltVA(), nullptr, 0); - buf += 16; - glink += 16; - } + for (const Symbol *sym : cast<PPC32GlinkSection>(in.plt)->canonical_plts) { + writePPC32PltCallStub(buf, sym->getGotPltVA(), nullptr, 0); + buf += 16; + glink += 16; + } } // On PPC Secure PLT ABI, bl foo@plt jumps to a call stub, which loads an Modified: head/contrib/llvm-project/lld/ELF/Relocations.cpp ============================================================================== --- head/contrib/llvm-project/lld/ELF/Relocations.cpp Wed Mar 18 20:12:46 2020 (r359083) +++ head/contrib/llvm-project/lld/ELF/Relocations.cpp Wed Mar 18 20:28:26 2020 (r359084) @@ -1206,6 +1206,7 @@ static void processRelocAux(InputSectionBase &sec, Rel // PPC32 canonical PLT entries are at the beginning of .glink cast<Defined>(sym).value = in.plt->headerSize; in.plt->headerSize += 16; + cast<PPC32GlinkSection>(in.plt)->canonical_plts.push_back(&sym); } } sym.needsPltAddr = true; Modified: head/contrib/llvm-project/lld/ELF/SyntheticSections.cpp ============================================================================== --- head/contrib/llvm-project/lld/ELF/SyntheticSections.cpp Wed Mar 18 20:12:46 2020 (r359083) +++ head/contrib/llvm-project/lld/ELF/SyntheticSections.cpp Wed Mar 18 20:28:26 2020 (r359084) @@ -2446,12 +2446,9 @@ PltSection::PltSection() : SyntheticSection(SHF_ALLOC | SHF_EXECINSTR, SHT_PROGBITS, 16, ".plt"), headerSize(target->pltHeaderSize) { // On PowerPC, this section contains lazy symbol resolvers. - if (config->emachine == EM_PPC || config->emachine == EM_PPC64) { + if (config->emachine == EM_PPC64) { name = ".glink"; alignment = 4; - // PLTresolve is at the end. - if (config->emachine == EM_PPC) - footerSize = 64; } // On x86 when IBT is enabled, this section contains the second PLT (lazy @@ -2467,11 +2464,6 @@ PltSection::PltSection() } void PltSection::writeTo(uint8_t *buf) { - if (config->emachine == EM_PPC) { - writePPC32GlinkSection(buf, entries.size()); - return; - } - // At beginning of PLT, we have code to call the dynamic // linker to resolve dynsyms at runtime. Write such code. target->writePltHeader(buf); @@ -2489,7 +2481,7 @@ void PltSection::addEntry(Symbol &sym) { } size_t PltSection::getSize() const { - return headerSize + entries.size() * target->pltEntrySize + footerSize; + return headerSize + entries.size() * target->pltEntrySize; } bool PltSection::isNeeded() const { @@ -2541,6 +2533,19 @@ void IpltSection::addSymbols() { target->addPltSymbols(*this, off); off += target->pltEntrySize; } +} + +PPC32GlinkSection::PPC32GlinkSection() { + name = ".glink"; + alignment = 4; +} + +void PPC32GlinkSection::writeTo(uint8_t *buf) { + writePPC32GlinkSection(buf, entries.size()); +} + +size_t PPC32GlinkSection::getSize() const { + return headerSize + entries.size() * target->pltEntrySize + footerSize; } // This is an x86-only extra PLT section and used only when a security Modified: head/contrib/llvm-project/lld/ELF/SyntheticSections.h ============================================================================== --- head/contrib/llvm-project/lld/ELF/SyntheticSections.h Wed Mar 18 20:12:46 2020 (r359083) +++ head/contrib/llvm-project/lld/ELF/SyntheticSections.h Wed Mar 18 20:28:26 2020 (r359084) @@ -684,7 +684,6 @@ class PltSection : public SyntheticSection { (public) size_t getNumEntries() const { return entries.size(); } size_t headerSize; - size_t footerSize = 0; std::vector<const Symbol *> entries; }; @@ -703,6 +702,16 @@ class IpltSection final : public SyntheticSection { (p bool isNeeded() const override { return !entries.empty(); } void addSymbols(); void addEntry(Symbol &sym); +}; + +class PPC32GlinkSection : public PltSection { +public: + PPC32GlinkSection(); + void writeTo(uint8_t *buf) override; + size_t getSize() const override; + + std::vector<const Symbol *> canonical_plts; + static constexpr size_t footerSize = 64; }; // This is x86-only. Modified: head/contrib/llvm-project/lld/ELF/Writer.cpp ============================================================================== --- head/contrib/llvm-project/lld/ELF/Writer.cpp Wed Mar 18 20:12:46 2020 (r359083) +++ head/contrib/llvm-project/lld/ELF/Writer.cpp Wed Mar 18 20:28:26 2020 (r359084) @@ -521,7 +521,8 @@ template <class ELFT> void createSyntheticSections() { add(in.ibtPlt); } - in.plt = make<PltSection>(); + in.plt = config->emachine == EM_PPC ? make<PPC32GlinkSection>() + : make<PltSection>(); add(in.plt); in.iplt = make<IpltSection>(); add(in.iplt); _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"