[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:39:38 PST 2017
Fixed in r297063
On Mon, Mar 6, 2017 at 12:37 PM, Evgenii Stepanov
<eugeni.stepanov at gmail.com> wrote:
> 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