[lld] r297008 - [ELF] - Make Bss and BssRelRo sections to be synthetic (#2).

Evgenii Stepanov via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 6 12:37:48 PST 2017


tools/lld/ELF/Symbols.cpp:215:13: error: unused variable 'S'
[-Werror,-Wunused-variable]
  if (auto *S = dyn_cast<SharedSymbol>(this))
            ^

Please test the code with -DLLVM_ENABLE_WERROR=ON before committing!


On Mon, Mar 6, 2017 at 6:37 AM, George Rimar via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: grimar
> Date: Mon Mar  6 08:37:45 2017
> New Revision: 297008
>
> URL: http://llvm.org/viewvc/llvm-project?rev=297008&view=rev
> Log:
> [ELF] - Make Bss and BssRelRo sections to be synthetic (#2).
>
> In compare with D30458, this makes Bss/BssRelRo to be pure
> synthetic sections.
>
> That removes CopyRelSection class completely, making
> Bss/BssRelRo to be just regular synthetics.
>
> SharedSymbols involved in creating copy relocations are
> converted to DefinedRegular, what also simplifies things.
>
> Differential revision: https://reviews.llvm.org/D30541
>
>
> Modified:
>     lld/trunk/ELF/OutputSections.cpp
>     lld/trunk/ELF/OutputSections.h
>     lld/trunk/ELF/Relocations.cpp
>     lld/trunk/ELF/Symbols.cpp
>     lld/trunk/ELF/Symbols.h
>     lld/trunk/ELF/SyntheticSections.cpp
>     lld/trunk/ELF/SyntheticSections.h
>     lld/trunk/ELF/Writer.cpp
>
> Modified: lld/trunk/ELF/OutputSections.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=297008&r1=297007&r2=297008&view=diff
> ==============================================================================
> --- lld/trunk/ELF/OutputSections.cpp (original)
> +++ lld/trunk/ELF/OutputSections.cpp Mon Mar  6 08:37:45 2017
> @@ -31,8 +31,6 @@ using namespace lld;
>  using namespace lld::elf;
>
>  uint8_t Out::First;
> -OutputSection *Out::Bss;
> -OutputSection *Out::BssRelRo;
>  OutputSection *Out::Opd;
>  uint8_t *Out::OpdBuf;
>  PhdrEntry *Out::TlsPhdr;
>
> Modified: lld/trunk/ELF/OutputSections.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.h?rev=297008&r1=297007&r2=297008&view=diff
> ==============================================================================
> --- lld/trunk/ELF/OutputSections.h (original)
> +++ lld/trunk/ELF/OutputSections.h Mon Mar  6 08:37:45 2017
> @@ -98,8 +98,6 @@ public:
>  // until Writer is initialized.
>  struct Out {
>    static uint8_t First;
> -  static OutputSection *Bss;
> -  static OutputSection *BssRelRo;
>    static OutputSection *Opd;
>    static uint8_t *OpdBuf;
>    static PhdrEntry *TlsPhdr;
>
> Modified: lld/trunk/ELF/Relocations.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=297008&r1=297007&r2=297008&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Relocations.cpp (original)
> +++ lld/trunk/ELF/Relocations.cpp Mon Mar  6 08:37:45 2017
> @@ -479,23 +479,20 @@ template <class ELFT> static void addCop
>    // See if this symbol is in a read-only segment. If so, preserve the symbol's
>    // memory protection by reserving space in the .bss.rel.ro section.
>    bool IsReadOnly = isReadOnly<ELFT>(SS);
> -  OutputSection *OSec = IsReadOnly ? Out::BssRelRo : Out::Bss;
> -
> -  // Create a SyntheticSection in Out to hold the .bss and the Copy Reloc.
> -  auto *ISec =
> -      make<CopyRelSection<ELFT>>(IsReadOnly, SS->getAlignment<ELFT>(), SymSize);
> -  OSec->addSection(ISec);
> +  BssRelSection<ELFT> *RelSec = IsReadOnly ? In<ELFT>::BssRelRo : In<ELFT>::Bss;
> +  size_t Off = RelSec->addCopyRelocation(SS->getAlignment<ELFT>(), SymSize);
>
>    // Look through the DSO's dynamic symbol table for aliases and create a
>    // dynamic symbol for each one. This causes the copy relocation to correctly
>    // interpose any aliases.
>    for (SharedSymbol *Sym : getSymbolsAt<ELFT>(SS)) {
> -    Sym->NeedsCopy = true;
> -    Sym->Section = ISec;
>      Sym->symbol()->IsUsedInRegularObj = true;
> +    replaceBody<DefinedRegular>(Sym->symbol(), Sym->getName(),
> +                                /*IsLocal=*/false, Sym->StOther, Sym->Type, Off,
> +                                Sym->getSize<ELFT>(), RelSec, nullptr);
>    }
>
> -  In<ELFT>::RelaDyn->addReloc({Target->CopyRel, ISec, 0, false, SS, 0});
> +  In<ELFT>::RelaDyn->addReloc({Target->CopyRel, RelSec, Off, false, SS, 0});
>  }
>
>  template <class ELFT>
> @@ -535,14 +532,12 @@ static RelExpr adjustExpr(const elf::Obj
>    if (Body.isObject()) {
>      // Produce a copy relocation.
>      auto *B = cast<SharedSymbol>(&Body);
> -    if (!B->NeedsCopy) {
> -      if (Config->ZNocopyreloc)
> -        error(S.getLocation<ELFT>(RelOff) + ": unresolvable relocation " +
> -              toString(Type) + " against symbol '" + toString(*B) +
> -              "'; recompile with -fPIC or remove '-z nocopyreloc'");
> +    if (Config->ZNocopyreloc)
> +      error(S.getLocation<ELFT>(RelOff) + ": unresolvable relocation " +
> +            toString(Type) + " against symbol '" + toString(*B) +
> +            "'; recompile with -fPIC or remove '-z nocopyreloc'");
>
> -      addCopyRelSymbol<ELFT>(B);
> -    }
> +    addCopyRelSymbol<ELFT>(B);
>      return Expr;
>    }
>    if (Body.isFunc()) {
>
> Modified: lld/trunk/ELF/Symbols.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=297008&r1=297007&r2=297008&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.cpp (original)
> +++ lld/trunk/ELF/Symbols.cpp Mon Mar  6 08:37:45 2017
> @@ -114,14 +114,10 @@ static typename ELFT::uint getSymVA(cons
>        return 0;
>      return In<ELFT>::Common->OutSec->Addr + In<ELFT>::Common->OutSecOff +
>             cast<DefinedCommon>(Body).Offset;
> -  case SymbolBody::SharedKind: {
> -    auto &SS = cast<SharedSymbol>(Body);
> -    if (SS.NeedsCopy)
> -      return SS.Section->OutSec->Addr + SS.Section->OutSecOff;
> -    if (SS.NeedsPltAddr)
> +  case SymbolBody::SharedKind:
> +    if (cast<SharedSymbol>(Body).NeedsPltAddr)
>        return Body.getPltVA<ELFT>();
>      return 0;
> -  }
>    case SymbolBody::UndefinedKind:
>      return 0;
>    case SymbolBody::LazyArchiveKind:
> @@ -134,7 +130,7 @@ static typename ELFT::uint getSymVA(cons
>
>  SymbolBody::SymbolBody(Kind K, StringRefZ Name, bool IsLocal, uint8_t StOther,
>                         uint8_t Type)
> -    : SymbolKind(K), NeedsCopy(false), NeedsPltAddr(false), IsLocal(IsLocal),
> +    : SymbolKind(K), NeedsPltAddr(false), IsLocal(IsLocal),
>        IsInGlobalMipsGot(false), Is32BitMipsGot(false), IsInIplt(false),
>        IsInIgot(false), Type(Type), StOther(StOther), Name(Name) {}
>
> @@ -145,10 +141,9 @@ bool SymbolBody::isPreemptible() const {
>      return false;
>
>    // Shared symbols resolve to the definition in the DSO. The exceptions are
> -  // symbols with copy relocations (which resolve to .bss) or preempt plt
> -  // entries (which resolve to that plt entry).
> +  // symbols that needs plt entries (which resolve to that plt entry).
>    if (isShared())
> -    return !NeedsCopy && !NeedsPltAddr;
> +    return !NeedsPltAddr;
>
>    // That's all that can be preempted in a non-DSO.
>    if (!Config->Shared)
> @@ -217,11 +212,8 @@ const OutputSection *SymbolBody::getOutp
>      return nullptr;
>    }
>
> -  if (auto *S = dyn_cast<SharedSymbol>(this)) {
> -    if (S->NeedsCopy)
> -      return S->Section->OutSec;
> +  if (auto *S = dyn_cast<SharedSymbol>(this))
>      return nullptr;
> -  }
>
>    if (isa<DefinedCommon>(this)) {
>      if (Config->DefineCommon)
>
> Modified: lld/trunk/ELF/Symbols.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=297008&r1=297007&r2=297008&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.h (original)
> +++ lld/trunk/ELF/Symbols.h Mon Mar  6 08:37:45 2017
> @@ -102,10 +102,6 @@ protected:
>    const unsigned SymbolKind : 8;
>
>  public:
> -  // True if the linker has to generate a copy relocation.
> -  // For SharedSymbol only.
> -  unsigned NeedsCopy : 1;
> -
>    // True the symbol should point to its PLT entry.
>    // For SharedSymbol only.
>    unsigned NeedsPltAddr : 1;
> @@ -270,9 +266,6 @@ public:
>    // This field is a pointer to the symbol's version definition.
>    const void *Verdef;
>
> -  // Section is significant only when NeedsCopy is true.
> -  InputSection *Section = nullptr;
> -
>  private:
>    template <class ELFT> const typename ELFT::Sym &getSym() const {
>      return *(const typename ELFT::Sym *)ElfSym;
>
> Modified: lld/trunk/ELF/SyntheticSections.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=297008&r1=297007&r2=297008&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SyntheticSections.cpp (original)
> +++ lld/trunk/ELF/SyntheticSections.cpp Mon Mar  6 08:37:45 2017
> @@ -376,10 +376,17 @@ void BuildIdSection<ELFT>::computeHash(
>  }
>
>  template <class ELFT>
> -CopyRelSection<ELFT>::CopyRelSection(bool ReadOnly, uintX_t AddrAlign, size_t S)
> -    : SyntheticSection(SHF_ALLOC, SHT_NOBITS, AddrAlign,
> -                       ReadOnly ? ".bss.rel.ro" : ".bss"),
> -      Size(S) {}
> +BssRelSection<ELFT>::BssRelSection(bool RelRo)
> +    : SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_NOBITS, 0,
> +                       RelRo ? ".bss.rel.ro" : ".bss"),
> +      Size(0) {}
> +
> +template <class ELFT>
> +size_t BssRelSection<ELFT>::addCopyRelocation(uintX_t AddrAlign, size_t Size) {
> +  OutSec->updateAlignment(AddrAlign);
> +  this->Size = alignTo(this->Size, AddrAlign) + Size;
> +  return this->Size - Size;
> +}
>
>  template <class ELFT>
>  void BuildIdSection<ELFT>::writeBuildId(ArrayRef<uint8_t> Buf) {
> @@ -2303,10 +2310,10 @@ template class elf::BuildIdSection<ELF32
>  template class elf::BuildIdSection<ELF64LE>;
>  template class elf::BuildIdSection<ELF64BE>;
>
> -template class elf::CopyRelSection<ELF32LE>;
> -template class elf::CopyRelSection<ELF32BE>;
> -template class elf::CopyRelSection<ELF64LE>;
> -template class elf::CopyRelSection<ELF64BE>;
> +template class elf::BssRelSection<ELF32LE>;
> +template class elf::BssRelSection<ELF32BE>;
> +template class elf::BssRelSection<ELF64LE>;
> +template class elf::BssRelSection<ELF64BE>;
>
>  template class elf::GotSection<ELF32LE>;
>  template class elf::GotSection<ELF32BE>;
>
> Modified: lld/trunk/ELF/SyntheticSections.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.h?rev=297008&r1=297007&r2=297008&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SyntheticSections.h (original)
> +++ lld/trunk/ELF/SyntheticSections.h Mon Mar  6 08:37:45 2017
> @@ -147,14 +147,16 @@ private:
>    uint8_t *HashBuf;
>  };
>
> -// For each copy relocation, we create an instance of this class to
> -// reserve space in .bss or .bss.rel.ro.
> -template <class ELFT> class CopyRelSection final : public SyntheticSection {
> +// Section used for storing copy relocations. We create two sections now,
> +// .bss.rel.ro for RelRo case and .bss for regular case.
> +template <class ELFT> class BssRelSection final : public SyntheticSection {
>    typedef typename ELFT::uint uintX_t;
>
>  public:
> -  CopyRelSection(bool ReadOnly, uintX_t AddrAlign, size_t Size);
> +  BssRelSection(bool RelRo);
>    void writeTo(uint8_t *) override {}
> +  bool empty() const override { return getSize() == 0; }
> +  size_t addCopyRelocation(uintX_t AddrAlign, size_t Size);
>    size_t getSize() const override { return Size; }
>    size_t Size;
>  };
> @@ -760,6 +762,8 @@ SymbolBody *addSyntheticLocal(StringRef
>  template <class ELFT> struct In {
>    static InputSection *ARMAttributes;
>    static BuildIdSection<ELFT> *BuildId;
> +  static BssRelSection<ELFT> *Bss;
> +  static BssRelSection<ELFT> *BssRelRo;
>    static InputSection *Common;
>    static DynamicSection<ELFT> *Dynamic;
>    static StringTableSection<ELFT> *DynStrTab;
> @@ -789,6 +793,8 @@ template <class ELFT> struct In {
>  };
>
>  template <class ELFT> InputSection *In<ELFT>::ARMAttributes;
> +template <class ELFT> BssRelSection<ELFT> *In<ELFT>::Bss;
> +template <class ELFT> BssRelSection<ELFT> *In<ELFT>::BssRelRo;
>  template <class ELFT> BuildIdSection<ELFT> *In<ELFT>::BuildId;
>  template <class ELFT> InputSection *In<ELFT>::Common;
>  template <class ELFT> DynamicSection<ELFT> *In<ELFT>::Dynamic;
>
> Modified: lld/trunk/ELF/Writer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=297008&r1=297007&r2=297008&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Writer.cpp (original)
> +++ lld/trunk/ELF/Writer.cpp Mon Mar  6 08:37:45 2017
> @@ -111,8 +111,8 @@ StringRef elf::getOutputSectionName(Stri
>    }
>
>    for (StringRef V :
> -       {".text.", ".rodata.", ".data.rel.ro.", ".data.", ".bss.",
> -        ".init_array.", ".fini_array.", ".ctors.", ".dtors.", ".tbss.",
> +       {".text.", ".rodata.", ".data.rel.ro.", ".data.", ".bss.rel.ro.",
> +        ".bss.", ".init_array.", ".fini_array.", ".ctors.", ".dtors.", ".tbss.",
>          ".gcc_except_table.", ".tdata.", ".ARM.exidx."}) {
>      StringRef Prefix = V.drop_back();
>      if (Name.startswith(V) || Name == Prefix)
> @@ -309,10 +309,6 @@ template <class ELFT> void Writer<ELFT>:
>
>    auto Add = [](InputSectionBase *Sec) { InputSections.push_back(Sec); };
>
> -  // Create singleton output sections.
> -  Out::Bss = make<OutputSection>(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE);
> -  Out::BssRelRo =
> -      make<OutputSection>(".bss.rel.ro", SHT_NOBITS, SHF_ALLOC | SHF_WRITE);
>    In<ELFT>::DynStrTab = make<StringTableSection<ELFT>>(".dynstr", true);
>    In<ELFT>::Dynamic = make<DynamicSection<ELFT>>();
>    In<ELFT>::RelaDyn = make<RelocationSection<ELFT>>(
> @@ -350,6 +346,11 @@ template <class ELFT> void Writer<ELFT>:
>      Add(Common);
>    }
>
> +  In<ELFT>::Bss = make<BssRelSection<ELFT>>(false /*RelRo*/);
> +  Add(In<ELFT>::Bss);
> +  In<ELFT>::BssRelRo = make<BssRelSection<ELFT>>(true /*RelRo*/);
> +  Add(In<ELFT>::BssRelRo);
> +
>    // Add MIPS-specific sections.
>    bool HasDynSymTab =
>        !Symtab<ELFT>::X->getSharedFiles().empty() || Config->pic() ||
> @@ -595,7 +596,7 @@ template <class ELFT> bool elf::isRelroS
>      return true;
>    if (In<ELFT>::Got && Sec == In<ELFT>::Got->OutSec)
>      return true;
> -  if (Sec == Out::BssRelRo)
> +  if (Sec == In<ELFT>::BssRelRo->OutSec)
>      return true;
>
>    StringRef S = Sec->Name;
> @@ -1159,27 +1160,18 @@ template <class ELFT> void Writer<ELFT>:
>    // Dynamic section must be the last one in this list and dynamic
>    // symbol table section (DynSymTab) must be the first one.
>    finalizeSynthetic<ELFT>(
> -      {In<ELFT>::DynSymTab, In<ELFT>::GnuHashTab, In<ELFT>::HashTab,
> -       In<ELFT>::SymTab,    In<ELFT>::ShStrTab,   In<ELFT>::StrTab,
> -       In<ELFT>::VerDef,    In<ELFT>::DynStrTab,  In<ELFT>::GdbIndex,
> -       In<ELFT>::Got,       In<ELFT>::MipsGot,    In<ELFT>::IgotPlt,
> -       In<ELFT>::GotPlt,    In<ELFT>::RelaDyn,    In<ELFT>::RelaIplt,
> -       In<ELFT>::RelaPlt,   In<ELFT>::Plt,        In<ELFT>::Iplt,
> -       In<ELFT>::Plt,       In<ELFT>::EhFrameHdr, In<ELFT>::VerSym,
> -       In<ELFT>::VerNeed,   In<ELFT>::Dynamic});
> +      {In<ELFT>::DynSymTab,  In<ELFT>::Bss,      In<ELFT>::BssRelRo,
> +       In<ELFT>::GnuHashTab, In<ELFT>::HashTab,  In<ELFT>::SymTab,
> +       In<ELFT>::ShStrTab,   In<ELFT>::StrTab,   In<ELFT>::VerDef,
> +       In<ELFT>::DynStrTab,  In<ELFT>::GdbIndex, In<ELFT>::Got,
> +       In<ELFT>::MipsGot,    In<ELFT>::IgotPlt,  In<ELFT>::GotPlt,
> +       In<ELFT>::RelaDyn,    In<ELFT>::RelaIplt, In<ELFT>::RelaPlt,
> +       In<ELFT>::Plt,        In<ELFT>::Iplt,     In<ELFT>::Plt,
> +       In<ELFT>::EhFrameHdr, In<ELFT>::VerSym,   In<ELFT>::VerNeed,
> +       In<ELFT>::Dynamic});
>  }
>
>  template <class ELFT> void Writer<ELFT>::addPredefinedSections() {
> -  // Add BSS sections.
> -  auto Add = [=](OutputSection *Sec) {
> -    if (!Sec->Sections.empty()) {
> -      Sec->assignOffsets<ELFT>();
> -      OutputSections.push_back(Sec);
> -    }
> -  };
> -  Add(Out::Bss);
> -  Add(Out::BssRelRo);
> -
>    // ARM ABI requires .ARM.exidx to be terminated by some piece of data.
>    // We have the terminater synthetic section class. Add that at the end.
>    auto *OS = dyn_cast_or_null<OutputSection>(findSection(".ARM.exidx"));
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list