diff options
-rw-r--r-- | lld/ELF/Writer.cpp | 58 |
1 files changed, 22 insertions, 36 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 10ec3f096f5..09992cad7d0 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -1193,31 +1193,18 @@ template <class ELFT> std::vector<PhdrEntry> Writer<ELFT>::createPhdrs() { }; // The first phdr entry is PT_PHDR which describes the program header itself. - PhdrEntry &Hdr = *AddHdr(PT_PHDR, PF_R); - Hdr.add(Out<ELFT>::ProgramHeaders); + AddHdr(PT_PHDR, PF_R)->add(Out<ELFT>::ProgramHeaders); // PT_INTERP must be the second entry if exists. - if (OutputSectionBase *Sec = findSection(".interp")) { - PhdrEntry &Hdr = *AddHdr(PT_INTERP, Sec->getPhdrFlags()); - Hdr.add(Sec); - } + if (OutputSectionBase *Sec = findSection(".interp")) + AddHdr(PT_INTERP, Sec->getPhdrFlags())->add(Sec); // Add the first PT_LOAD segment for regular output sections. uintX_t Flags = computeFlags<ELFT>(PF_R); PhdrEntry *Load = AddHdr(PT_LOAD, Flags); - - PhdrEntry TlsHdr(PT_TLS, PF_R); - PhdrEntry RelRo(PT_GNU_RELRO, PF_R); for (OutputSectionBase *Sec : OutputSections) { if (!(Sec->Flags & SHF_ALLOC)) break; - - // If we meet TLS section then we create TLS header - // and put all TLS sections inside for further use when - // assign addresses. - if (Sec->Flags & SHF_TLS) - TlsHdr.add(Sec); - if (!needsPtLoad<ELFT>(Sec)) continue; @@ -1233,48 +1220,47 @@ template <class ELFT> std::vector<PhdrEntry> Writer<ELFT>::createPhdrs() { } Load->add(Sec); - - if (isRelroSection<ELFT>(Sec)) - RelRo.add(Sec); } - // Add the TLS segment unless it's empty. + // Add a TLS segment if any. + PhdrEntry TlsHdr(PT_TLS, PF_R); + for (OutputSectionBase *Sec : OutputSections) + if (Sec->Flags & SHF_TLS) + TlsHdr.add(Sec); if (TlsHdr.First) Ret.push_back(std::move(TlsHdr)); // Add an entry for .dynamic. - if (In<ELFT>::DynSymTab) { - PhdrEntry &H = - *AddHdr(PT_DYNAMIC, In<ELFT>::Dynamic->OutSec->getPhdrFlags()); - H.add(In<ELFT>::Dynamic->OutSec); - } + if (In<ELFT>::DynSymTab) + AddHdr(PT_DYNAMIC, In<ELFT>::Dynamic->OutSec->getPhdrFlags()) + ->add(In<ELFT>::Dynamic->OutSec); // PT_GNU_RELRO includes all sections that should be marked as // read-only by dynamic linker after proccessing relocations. + PhdrEntry RelRo(PT_GNU_RELRO, PF_R); + for (OutputSectionBase *Sec : OutputSections) + if (needsPtLoad<ELFT>(Sec) && isRelroSection<ELFT>(Sec)) + RelRo.add(Sec); if (RelRo.First) Ret.push_back(std::move(RelRo)); // PT_GNU_EH_FRAME is a special section pointing on .eh_frame_hdr. - if (!Out<ELFT>::EhFrame->empty() && In<ELFT>::EhFrameHdr) { - PhdrEntry &Hdr = - *AddHdr(PT_GNU_EH_FRAME, In<ELFT>::EhFrameHdr->OutSec->getPhdrFlags()); - Hdr.add(In<ELFT>::EhFrameHdr->OutSec); - } + if (!Out<ELFT>::EhFrame->empty() && In<ELFT>::EhFrameHdr) + AddHdr(PT_GNU_EH_FRAME, In<ELFT>::EhFrameHdr->OutSec->getPhdrFlags()) + ->add(In<ELFT>::EhFrameHdr->OutSec); // PT_OPENBSD_RANDOMIZE specifies the location and size of a part of the // memory image of the program that must be filled with random data before any // code in the object is executed. - if (OutputSectionBase *Sec = findSection(".openbsd.randomdata")) { - PhdrEntry &Hdr = *AddHdr(PT_OPENBSD_RANDOMIZE, Sec->getPhdrFlags()); - Hdr.add(Sec); - } + if (OutputSectionBase *Sec = findSection(".openbsd.randomdata")) + AddHdr(PT_OPENBSD_RANDOMIZE, Sec->getPhdrFlags())->add(Sec); // PT_GNU_STACK is a special section to tell the loader to make the // pages for the stack non-executable. if (!Config->ZExecstack) { - PhdrEntry &Hdr = *AddHdr(PT_GNU_STACK, PF_R | PF_W); + PhdrEntry *Hdr = AddHdr(PT_GNU_STACK, PF_R | PF_W); if (Config->ZStackSize != uint64_t(-1)) - Hdr.p_memsz = Config->ZStackSize; + Hdr->p_memsz = Config->ZStackSize; } // PT_OPENBSD_WXNEEDED is a OpenBSD-specific header to mark the executable |