Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Mar 2020 20:28:26 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r359084 - in head/contrib/llvm-project/lld/ELF: . Arch
Message-ID:  <202003182028.02IKSQGH087844@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202003182028.02IKSQGH087844>