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:
Rui Ueyama 2016-08-09 04:25:20 +00:00
parent 3b2c002c6d
commit a8f6feaa1a
3 changed files with 28 additions and 23 deletions

View File

@ -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))

View File

@ -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

View File

@ -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