forked from OSchip/llvm-project
Separate {Preinit,Init,Fini}Arrays from Out<ELFT>::Dynamic.
Even if an output is not a dynamic object, the output may have .{preinit,init,fini} sections. Therefore, managing these sections as Out<ELFT>::Dynamic's members is not correct. llvm-svn: 278093
This commit is contained in:
parent
3b2c002c6d
commit
a8f6feaa1a
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue