summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Writer.cpp93
1 files changed, 47 insertions, 46 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index bf613405c1f..dcb5cfccdbe 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -105,59 +105,60 @@ private:
template <class ELFT> static bool shouldUseRela() { return ELFT::Is64Bits; }
template <class ELFT> void elf2::writeResult(SymbolTable<ELFT> *Symtab) {
- // Initialize output sections that are handled by Writer specially.
- // Don't reorder because the order of initialization matters.
- InterpSection<ELFT> Interp;
- Out<ELFT>::Interp = &Interp;
- StringTableSection<ELFT> ShStrTab(".shstrtab", false);
- Out<ELFT>::ShStrTab = &ShStrTab;
- StringTableSection<ELFT> StrTab(".strtab", false);
- if (!Config->StripAll)
- Out<ELFT>::StrTab = &StrTab;
- else
- Out<ELFT>::StrTab = nullptr;
- StringTableSection<ELFT> DynStrTab(".dynstr", true);
- Out<ELFT>::DynStrTab = &DynStrTab;
+ // Create singleton output sections.
+ bool IsRela = shouldUseRela<ELFT>();
+ DynamicSection<ELFT> Dynamic(*Symtab);
+ EhFrameHeader<ELFT> EhFrameHdr;
GotSection<ELFT> Got;
- Out<ELFT>::Got = &Got;
- GotPltSection<ELFT> GotPlt;
- if (Target->UseLazyBinding)
- Out<ELFT>::GotPlt = &GotPlt;
- else
- Out<ELFT>::GotPlt = nullptr;
+ InterpSection<ELFT> Interp;
PltSection<ELFT> Plt;
- Out<ELFT>::Plt = &Plt;
- std::unique_ptr<SymbolTableSection<ELFT>> SymTab;
+ RelocationSection<ELFT> RelaDyn(IsRela ? ".rela.dyn" : ".rel.dyn", IsRela);
+ StringTableSection<ELFT> DynStrTab(".dynstr", true);
+ StringTableSection<ELFT> ShStrTab(".shstrtab", false);
+ SymbolTableSection<ELFT> DynSymTab(*Symtab, DynStrTab);
+
+ // Instantiate optional output sections if they are needed.
+ std::unique_ptr<GnuHashTableSection<ELFT>> GnuHashTab;
+ std::unique_ptr<GotPltSection<ELFT>> GotPlt;
+ std::unique_ptr<HashTableSection<ELFT>> HashTab;
+ std::unique_ptr<RelocationSection<ELFT>> RelaPlt;
+ std::unique_ptr<StringTableSection<ELFT>> StrTab;
+ std::unique_ptr<SymbolTableSection<ELFT>> SymTabSec;
+
+ if (Config->GnuHash)
+ GnuHashTab.reset(new GnuHashTableSection<ELFT>);
+ if (Config->SysvHash)
+ HashTab.reset(new HashTableSection<ELFT>);
+ if (Target->UseLazyBinding) {
+ StringRef S = IsRela ? ".rela.plt" : ".rel.plt";
+ GotPlt.reset(new GotPltSection<ELFT>);
+ RelaPlt.reset(new RelocationSection<ELFT>(S, IsRela));
+ }
if (!Config->StripAll) {
- SymTab.reset(new SymbolTableSection<ELFT>(*Symtab, *Out<ELFT>::StrTab));
- Out<ELFT>::SymTab = SymTab.get();
- } else {
- Out<ELFT>::SymTab = nullptr;
+ StrTab.reset(new StringTableSection<ELFT>(".strtab", false));
+ SymTabSec.reset(new SymbolTableSection<ELFT>(*Symtab, *StrTab));
}
- SymbolTableSection<ELFT> DynSymTab(*Symtab, *Out<ELFT>::DynStrTab);
+
+ Out<ELFT>::DynStrTab = &DynStrTab;
Out<ELFT>::DynSymTab = &DynSymTab;
- HashTableSection<ELFT> HashTab;
- if (Config->SysvHash)
- Out<ELFT>::HashTab = &HashTab;
- else
- Out<ELFT>::HashTab = nullptr;
- GnuHashTableSection<ELFT> GnuHashTab;
- if (Config->GnuHash)
- Out<ELFT>::GnuHashTab = &GnuHashTab;
- else
- Out<ELFT>::GnuHashTab = nullptr;
- bool IsRela = shouldUseRela<ELFT>();
- RelocationSection<ELFT> RelaDyn(IsRela ? ".rela.dyn" : ".rel.dyn", IsRela);
- Out<ELFT>::RelaDyn = &RelaDyn;
- RelocationSection<ELFT> RelaPlt(IsRela ? ".rela.plt" : ".rel.plt", IsRela);
- if (Target->UseLazyBinding)
- Out<ELFT>::RelaPlt = &RelaPlt;
- else
- Out<ELFT>::RelaPlt = nullptr;
- DynamicSection<ELFT> Dynamic(*Symtab);
Out<ELFT>::Dynamic = &Dynamic;
- EhFrameHeader<ELFT> EhFrameHdr;
Out<ELFT>::EhFrameHdr = &EhFrameHdr;
+ Out<ELFT>::GnuHashTab = GnuHashTab.get();
+ Out<ELFT>::Got = &Got;
+ Out<ELFT>::GotPlt = GotPlt.get();
+ Out<ELFT>::HashTab = HashTab.get();
+ Out<ELFT>::Interp = &Interp;
+ Out<ELFT>::Plt = &Plt;
+ Out<ELFT>::RelaDyn = &RelaDyn;
+ Out<ELFT>::RelaPlt = RelaPlt.get();
+ Out<ELFT>::ShStrTab = &ShStrTab;
+ Out<ELFT>::StrTab = StrTab.get();
+ Out<ELFT>::SymTab = SymTabSec.get();
+ Out<ELFT>::Bss = nullptr;
+ Out<ELFT>::MipsRldMap = nullptr;
+ Out<ELFT>::Opd = nullptr;
+ Out<ELFT>::OpdBuf = nullptr;
+ Out<ELFT>::TlsPhdr = nullptr;
Writer<ELFT>(*Symtab).run();
}
OpenPOWER on IntegriCloud