Index: ELF/OutputSections.h =================================================================== --- ELF/OutputSections.h +++ ELF/OutputSections.h @@ -481,11 +481,10 @@ std::vector FdeList; }; -// All output sections that are hadnled by the linker specially are +// All output sections that are handled by the linker specially are // globally accessible. Writer initializes them, so don't use them // until Writer is initialized. template struct Out { - typedef typename llvm::object::ELFFile::uintX_t uintX_t; typedef typename llvm::object::ELFFile::Elf_Phdr Elf_Phdr; static DynamicSection *Dynamic; static EhFrameHeader *EhFrameHdr; Index: ELF/Writer.cpp =================================================================== --- ELF/Writer.cpp +++ ELF/Writer.cpp @@ -105,59 +105,60 @@ template static bool shouldUseRela() { return ELFT::Is64Bits; } template void elf2::writeResult(SymbolTable *Symtab) { - // Initialize output sections that are handled by Writer specially. - // Don't reorder because the order of initialization matters. + // Create singleton output sections. Do not reorder because the order + // of initialization matters. + std::unique_ptr> StrTab; + std::unique_ptr> GotPlt; + std::unique_ptr> SymTabSec; + std::unique_ptr> DynSymTab; + std::unique_ptr> HashTab; + std::unique_ptr> GnuHashTab; + std::unique_ptr> RelaPlt; + InterpSection Interp; - Out::Interp = &Interp; StringTableSection ShStrTab(".shstrtab", false); - Out::ShStrTab = &ShStrTab; - StringTableSection StrTab(".strtab", false); if (!Config->StripAll) - Out::StrTab = &StrTab; - else - Out::StrTab = nullptr; + StrTab.reset(new StringTableSection(".strtab", false)); StringTableSection DynStrTab(".dynstr", true); - Out::DynStrTab = &DynStrTab; GotSection Got; - Out::Got = &Got; - GotPltSection GotPlt; if (Target->UseLazyBinding) - Out::GotPlt = &GotPlt; - else - Out::GotPlt = nullptr; + GotPlt.reset(new GotPltSection); PltSection Plt; - Out::Plt = &Plt; - std::unique_ptr> SymTab; - if (!Config->StripAll) { - SymTab.reset(new SymbolTableSection(*Symtab, *Out::StrTab)); - Out::SymTab = SymTab.get(); - } else { - Out::SymTab = nullptr; - } - SymbolTableSection DynSymTab(*Symtab, *Out::DynStrTab); - Out::DynSymTab = &DynSymTab; - HashTableSection HashTab; + if (!Config->StripAll) + SymTabSec.reset(new SymbolTableSection(*Symtab, *StrTab)); + DynSymTab.reset(new SymbolTableSection(*Symtab, DynStrTab)); if (Config->SysvHash) - Out::HashTab = &HashTab; - else - Out::HashTab = nullptr; - GnuHashTableSection GnuHashTab; + HashTab.reset(new HashTableSection); if (Config->GnuHash) - Out::GnuHashTab = &GnuHashTab; - else - Out::GnuHashTab = nullptr; + GnuHashTab.reset(new GnuHashTableSection); bool IsRela = shouldUseRela(); RelocationSection RelaDyn(IsRela ? ".rela.dyn" : ".rel.dyn", IsRela); - Out::RelaDyn = &RelaDyn; - RelocationSection RelaPlt(IsRela ? ".rela.plt" : ".rel.plt", IsRela); if (Target->UseLazyBinding) - Out::RelaPlt = &RelaPlt; - else - Out::RelaPlt = nullptr; + RelaPlt.reset( + new RelocationSection(IsRela ? ".rela.plt" : ".rel.plt", IsRela)); DynamicSection Dynamic(*Symtab); - Out::Dynamic = &Dynamic; EhFrameHeader EhFrameHdr; + + Out::Dynamic = &Dynamic; Out::EhFrameHdr = &EhFrameHdr; + Out::GnuHashTab = GnuHashTab.get(); + Out::GotPlt = GotPlt.get(); + Out::Got = &Got; + Out::HashTab = HashTab.get(); + Out::Interp = &Interp; + Out::Plt = &Plt; + Out::RelaDyn = &RelaDyn; + Out::RelaPlt = RelaPlt.get(); + Out::DynStrTab = &DynStrTab; + Out::ShStrTab = &ShStrTab; + Out::StrTab = StrTab.get(); + Out::DynSymTab = DynSymTab.get(); + Out::SymTab = SymTabSec.get(); + Out::MipsRldMap = nullptr; + Out::Bss = nullptr; + Out::Opd = nullptr; + Out::OpdBuf = nullptr; + Out::TlsPhdr = nullptr; Writer(*Symtab).run(); }