diff options
-rw-r--r-- | lld/ELF/OutputSections.cpp | 18 | ||||
-rw-r--r-- | lld/ELF/OutputSections.h | 11 | ||||
-rw-r--r-- | lld/ELF/Writer.cpp | 22 |
3 files changed, 28 insertions, 23 deletions
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index bf065d3197e..621405baee4 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -678,17 +678,17 @@ template <class ELFT> void DynamicSection<ELFT>::finalize() { if (Out<ELFT>::HashTab) Add({DT_HASH, Out<ELFT>::HashTab}); - if (PreInitArraySec) { - Add({DT_PREINIT_ARRAY, PreInitArraySec}); - Add({DT_PREINIT_ARRAYSZ, PreInitArraySec->getSize()}); + if (Out<ELFT>::PreinitArray) { + Add({DT_PREINIT_ARRAY, Out<ELFT>::PreinitArray}); + Add({DT_PREINIT_ARRAYSZ, Out<ELFT>::PreinitArray->getSize()}); } - if (InitArraySec) { - Add({DT_INIT_ARRAY, InitArraySec}); - Add({DT_INIT_ARRAYSZ, (uintX_t)InitArraySec->getSize()}); + if (Out<ELFT>::InitArray) { + Add({DT_INIT_ARRAY, Out<ELFT>::InitArray}); + Add({DT_INIT_ARRAYSZ, (uintX_t)Out<ELFT>::InitArray->getSize()}); } - if (FiniArraySec) { - Add({DT_FINI_ARRAY, FiniArraySec}); - Add({DT_FINI_ARRAYSZ, (uintX_t)FiniArraySec->getSize()}); + if (Out<ELFT>::FiniArray) { + Add({DT_FINI_ARRAY, Out<ELFT>::FiniArray}); + Add({DT_FINI_ARRAYSZ, (uintX_t)Out<ELFT>::FiniArray->getSize()}); } if (SymbolBody *B = Symtab<ELFT>::X->find(Config->Init)) diff --git a/lld/ELF/OutputSections.h b/lld/ELF/OutputSections.h index 4b40e78018f..5f5b691a319 100644 --- a/lld/ELF/OutputSections.h +++ b/lld/ELF/OutputSections.h @@ -527,10 +527,6 @@ public: explicit DynamicSection(); void finalize() override; void writeTo(uint8_t *Buf) override; - - OutputSectionBase<ELFT> *PreInitArraySec = nullptr; - OutputSectionBase<ELFT> *InitArraySec = nullptr; - OutputSectionBase<ELFT> *FiniArraySec = nullptr; }; template <class ELFT> @@ -657,6 +653,10 @@ template <class ELFT> struct Out { static Elf_Phdr *TlsPhdr; static OutputSectionBase<ELFT> *ElfHeader; static OutputSectionBase<ELFT> *ProgramHeaders; + + static OutputSectionBase<ELFT> *PreinitArray; + static OutputSectionBase<ELFT> *InitArray; + static OutputSectionBase<ELFT> *FiniArray; }; template <bool Is64Bits> struct SectionKey { @@ -716,6 +716,9 @@ template <class ELFT> VersionNeedSection<ELFT> *Out<ELFT>::VerNeed; template <class ELFT> typename ELFT::Phdr *Out<ELFT>::TlsPhdr; template <class ELFT> OutputSectionBase<ELFT> *Out<ELFT>::ElfHeader; template <class ELFT> OutputSectionBase<ELFT> *Out<ELFT>::ProgramHeaders; +template <class ELFT> OutputSectionBase<ELFT> *Out<ELFT>::PreinitArray; +template <class ELFT> OutputSectionBase<ELFT> *Out<ELFT>::InitArray; +template <class ELFT> OutputSectionBase<ELFT> *Out<ELFT>::FiniArray; } // namespace elf } // namespace lld diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index e780e2e4c66..bda9c8d2fbb 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -211,6 +211,10 @@ template <class ELFT> void elf::writeResult() { Out<ELFT>::ElfHeader = &ElfHeader; Out<ELFT>::ProgramHeaders = &ProgramHeaders; + Out<ELFT>::PreinitArray = nullptr; + Out<ELFT>::InitArray = nullptr; + Out<ELFT>::FiniArray = nullptr; + Writer<ELFT>().run(); } @@ -658,13 +662,13 @@ template <class ELFT> void Writer<ELFT>::createSections() { // Create output section objects and add them to OutputSections. template <class ELFT> void Writer<ELFT>::finalizeSections() { - Out<ELFT>::Dynamic->PreInitArraySec = findSection(".preinit_array"); - Out<ELFT>::Dynamic->InitArraySec = findSection(".init_array"); - Out<ELFT>::Dynamic->FiniArraySec = findSection(".fini_array"); + Out<ELFT>::PreinitArray = findSection(".preinit_array"); + Out<ELFT>::InitArray = findSection(".init_array"); + Out<ELFT>::FiniArray = findSection(".fini_array"); // Sort section contents for __attribute__((init_priority(N)). - sortInitFini(Out<ELFT>::Dynamic->InitArraySec); - sortInitFini(Out<ELFT>::Dynamic->FiniArraySec); + sortInitFini(Out<ELFT>::InitArray); + sortInitFini(Out<ELFT>::FiniArray); sortCtorsDtors(findSection(".ctors")); sortCtorsDtors(findSection(".dtors")); @@ -867,11 +871,9 @@ template <class ELFT> void Writer<ELFT>::addStartEndSymbols() { }; Define("__preinit_array_start", "__preinit_array_end", - Out<ELFT>::Dynamic->PreInitArraySec); - Define("__init_array_start", "__init_array_end", - Out<ELFT>::Dynamic->InitArraySec); - Define("__fini_array_start", "__fini_array_end", - Out<ELFT>::Dynamic->FiniArraySec); + Out<ELFT>::PreinitArray); + Define("__init_array_start", "__init_array_end", Out<ELFT>::InitArray); + Define("__fini_array_start", "__fini_array_end", Out<ELFT>::FiniArray); } // If a section name is valid as a C identifier (which is rare because of |