[lld] r297933 - Revert r297813 "[ELF] - Make Bss and BssRelRo sections to be synthetic (#3)."
Rafael Avila de Espindola via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 16 05:22:10 PDT 2017
BTW, could you please check in a test that would have been broken by the
original version (the missing symbol version problem)?
Thanks,
Rafael
George Rimar via llvm-commits <llvm-commits at lists.llvm.org> writes:
> Author: grimar
> Date: Thu Mar 16 03:44:53 2017
> New Revision: 297933
>
> URL: http://llvm.org/viewvc/llvm-project?rev=297933&view=rev
> Log:
> Revert r297813 "[ELF] - Make Bss and BssRelRo sections to be synthetic (#3)."
>
> I suppose it is the reason of BB fail:
> http://lab.llvm.org:8011/builders/clang-cmake-aarch64-lld/builds/921
>
> https://bugs.llvm.org/show_bug.cgi?id=32167
>
> Modified:
> lld/trunk/ELF/OutputSections.cpp
> 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=297933&r1=297932&r2=297933&view=diff
> ==============================================================================
> --- lld/trunk/ELF/OutputSections.cpp (original)
> +++ lld/trunk/ELF/OutputSections.cpp Thu Mar 16 03:44:53 2017
> @@ -31,6 +31,8 @@ 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/Relocations.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Relocations.cpp?rev=297933&r1=297932&r2=297933&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Relocations.cpp (original)
> +++ lld/trunk/ELF/Relocations.cpp Thu Mar 16 03:44:53 2017
> @@ -479,20 +479,23 @@ 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);
> - BssSection *Sec = IsReadOnly ? In<ELFT>::BssRelRo : In<ELFT>::Bss;
> - uintX_t Off = Sec->reserveSpace(SS->getAlignment<ELFT>(), SymSize);
> + 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);
>
> // 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->CopyRelSec = Sec;
> - Sym->CopyRelSecOff = Off;
> + Sym->Section = ISec;
> Sym->symbol()->IsUsedInRegularObj = true;
> }
>
> - In<ELFT>::RelaDyn->addReloc({Target->CopyRel, Sec, Off, false, SS, 0});
> + In<ELFT>::RelaDyn->addReloc({Target->CopyRel, ISec, 0, false, SS, 0});
> }
>
> template <class ELFT>
>
> Modified: lld/trunk/ELF/Symbols.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.cpp?rev=297933&r1=297932&r2=297933&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.cpp (original)
> +++ lld/trunk/ELF/Symbols.cpp Thu Mar 16 03:44:53 2017
> @@ -106,8 +106,7 @@ static typename ELFT::uint getSymVA(cons
> case SymbolBody::SharedKind: {
> auto &SS = cast<SharedSymbol>(Body);
> if (SS.NeedsCopy)
> - return SS.CopyRelSec->OutSec->Addr + SS.CopyRelSec->OutSecOff +
> - SS.CopyRelSecOff;
> + return SS.Section->OutSec->Addr + SS.Section->OutSecOff;
> if (SS.NeedsPltAddr)
> return Body.getPltVA<ELFT>();
> return 0;
> @@ -208,7 +207,7 @@ template <class ELFT> OutputSection *Sym
>
> if (auto *S = dyn_cast<SharedSymbol>(this)) {
> if (S->NeedsCopy)
> - return S->CopyRelSec->OutSec;
> + return S->Section->OutSec;
> return nullptr;
> }
>
>
> Modified: lld/trunk/ELF/Symbols.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Symbols.h?rev=297933&r1=297932&r2=297933&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Symbols.h (original)
> +++ lld/trunk/ELF/Symbols.h Thu Mar 16 03:44:53 2017
> @@ -238,9 +238,8 @@ public:
> // This field is a pointer to the symbol's version definition.
> const void *Verdef;
>
> - // CopyRelSec and CopyRelSecOff are significant only when NeedsCopy is true.
> - InputSection *CopyRelSec;
> - size_t CopyRelSecOff;
> + // Section is significant only when NeedsCopy is true.
> + InputSection *Section = nullptr;
>
> private:
> template <class ELFT> const typename ELFT::Sym &getSym() const {
>
> Modified: lld/trunk/ELF/SyntheticSections.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.cpp?rev=297933&r1=297932&r2=297933&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SyntheticSections.cpp (original)
> +++ lld/trunk/ELF/SyntheticSections.cpp Thu Mar 16 03:44:53 2017
> @@ -376,14 +376,12 @@ void BuildIdSection<ELFT>::computeHash(
> HashFn(HashBuf, Hashes);
> }
>
> -BssSection::BssSection(StringRef Name)
> - : SyntheticSection(SHF_ALLOC | SHF_WRITE, SHT_NOBITS, 0, Name) {}
> -
> -size_t BssSection::reserveSpace(uint32_t Alignment, size_t Size) {
> - OutSec->updateAlignment(Alignment);
> - this->Size = alignTo(this->Size, Alignment) + Size;
> - return this->Size - Size;
> -}
> +template <class ELFT>
> +CopyRelSection<ELFT>::CopyRelSection(bool ReadOnly, uint32_t Alignment,
> + size_t S)
> + : SyntheticSection(SHF_ALLOC, SHT_NOBITS, Alignment,
> + ReadOnly ? ".bss.rel.ro" : ".bss"),
> + Size(S) {}
>
> template <class ELFT>
> void BuildIdSection<ELFT>::writeBuildId(ArrayRef<uint8_t> Buf) {
> @@ -2264,8 +2262,6 @@ InputSection *ThunkSection<ELFT>::getTar
> }
>
> InputSection *InX::ARMAttributes;
> -BssSection *InX::Bss;
> -BssSection *InX::BssRelRo;
> InputSection *InX::Common;
> StringTableSection *InX::DynStrTab;
> InputSection *InX::Interp;
> @@ -2318,6 +2314,11 @@ 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::GotSection<ELF32LE>;
> template class elf::GotSection<ELF32BE>;
> template class elf::GotSection<ELF64LE>;
>
> Modified: lld/trunk/ELF/SyntheticSections.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SyntheticSections.h?rev=297933&r1=297932&r2=297933&view=diff
> ==============================================================================
> --- lld/trunk/ELF/SyntheticSections.h (original)
> +++ lld/trunk/ELF/SyntheticSections.h Thu Mar 16 03:44:53 2017
> @@ -153,19 +153,15 @@ private:
> uint8_t *HashBuf;
> };
>
> -// BssSection is used to reserve space for copy relocations. We create two
> -// instances of this class for .bss and .bss.rel.ro. .bss is used for writable
> -// symbols, and .bss.rel.ro is used for read-only symbols.
> -class BssSection final : public SyntheticSection {
> +// 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 {
> public:
> - BssSection(StringRef Name);
> + CopyRelSection(bool ReadOnly, uint32_t Alignment, size_t Size);
> void writeTo(uint8_t *) override {}
> - bool empty() const override { return getSize() == 0; }
> - size_t reserveSpace(uint32_t Alignment, size_t Size);
> - size_t getSize() const override { return Size; }
>
> -private:
> - size_t Size = 0;
> + size_t getSize() const override { return Size; }
> + size_t Size;
> };
>
> template <class ELFT> class MipsGotSection final : public SyntheticSection {
> @@ -760,8 +756,6 @@ SymbolBody *addSyntheticLocal(StringRef
> // Linker generated sections which can be used as inputs.
> struct InX {
> static InputSection *ARMAttributes;
> - static BssSection *Bss;
> - static BssSection *BssRelRo;
> static InputSection *Common;
> static StringTableSection *DynStrTab;
> static InputSection *Interp;
>
> Modified: lld/trunk/ELF/Writer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=297933&r1=297932&r2=297933&view=diff
> ==============================================================================
> --- lld/trunk/ELF/Writer.cpp (original)
> +++ lld/trunk/ELF/Writer.cpp Thu Mar 16 03:44:53 2017
> @@ -111,8 +111,8 @@ StringRef elf::getOutputSectionName(Stri
> }
>
> for (StringRef V :
> - {".text.", ".rodata.", ".data.rel.ro.", ".data.", ".bss.rel.ro.",
> - ".bss.", ".init_array.", ".fini_array.", ".ctors.", ".dtors.", ".tbss.",
> + {".text.", ".rodata.", ".data.rel.ro.", ".data.", ".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)
> @@ -327,6 +327,11 @@ 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>(".dynstr", true);
> In<ELFT>::Dynamic = make<DynamicSection<ELFT>>();
> In<ELFT>::RelaDyn = make<RelocationSection<ELFT>>(
> @@ -364,11 +369,6 @@ template <class ELFT> void Writer<ELFT>:
> Add(Common);
> }
>
> - In<ELFT>::Bss = make<BssSection>(".bss");
> - Add(In<ELFT>::Bss);
> - In<ELFT>::BssRelRo = make<BssSection>(".bss.rel.ro");
> - Add(In<ELFT>::BssRelRo);
> -
> // Add MIPS-specific sections.
> bool HasDynSymTab =
> !Symtab<ELFT>::X->getSharedFiles().empty() || Config->pic() ||
> @@ -618,7 +618,7 @@ template <class ELFT> bool elf::isRelroS
> return true;
> if (In<ELFT>::Got && Sec == In<ELFT>::Got->OutSec)
> return true;
> - if (Sec == In<ELFT>::BssRelRo->OutSec)
> + if (Sec == Out::BssRelRo)
> return true;
>
> StringRef S = Sec->Name;
> @@ -1168,15 +1168,14 @@ 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.
> applySynthetic<ELFT>(
> - {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},
> + {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},
> [](SyntheticSection *SS) { SS->finalizeContents(); });
>
> // Some architectures use small displacements for jump instructions.
> @@ -1205,6 +1204,16 @@ template <class ELFT> void Writer<ELFT>:
> }
>
> 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