[lld] r279414 - Do not add .interp, .dynamic nor .eh_frame_hdr to segments just by type.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 21 21:55:20 PDT 2016


Author: ruiu
Date: Sun Aug 21 23:55:20 2016
New Revision: 279414

URL: http://llvm.org/viewvc/llvm-project?rev=279414&view=rev
Log:
Do not add .interp, .dynamic nor .eh_frame_hdr to segments just by type.

Summary:
We previously added these output sections to segments just by type.
Therefore, if there's a PHDRS command like this

  PHDRS {
    headers PT_PHDR PHDRS;
    interp PT_INTERP;
  }

  SECTIONS {
    . = SIZEOF_HEADERS;
    .interp : { *(.interp) } :text
  }

then .interp was added to "interp" segment even though the linker
is not instructed to do so by SECTIONS command. This patch removes
the default behavior to simplify.

Differential Revision: https://reviews.llvm.org/D23702

Modified:
    lld/trunk/ELF/LinkerScript.cpp

Modified: lld/trunk/ELF/LinkerScript.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/LinkerScript.cpp?rev=279414&r1=279413&r2=279414&view=diff
==============================================================================
--- lld/trunk/ELF/LinkerScript.cpp (original)
+++ lld/trunk/ELF/LinkerScript.cpp Sun Aug 21 23:55:20 2016
@@ -430,11 +430,13 @@ template <class ELFT> void LinkerScript<
   Out<ELFT>::ProgramHeaders->setVA(Out<ELFT>::ElfHeader->getSize() + MinVA);
 }
 
+// Creates program headers as instructed by PHDRS linker script command.
 template <class ELFT>
 std::vector<PhdrEntry<ELFT>> LinkerScript<ELFT>::createPhdrs() {
-  ArrayRef<OutputSectionBase<ELFT> *> Sections = *OutputSections;
   std::vector<PhdrEntry<ELFT>> Ret;
 
+  // Process PHDRS and FILEHDR keywords because they are not
+  // real output sections and cannot be added in the following loop.
   for (const PhdrsCommand &Cmd : Opt.PhdrsCommands) {
     Ret.emplace_back(Cmd.Type, Cmd.Flags == UINT_MAX ? PF_R : Cmd.Flags);
     PhdrEntry<ELFT> &Phdr = Ret.back();
@@ -443,30 +445,12 @@ std::vector<PhdrEntry<ELFT>> LinkerScrip
       Phdr.add(Out<ELFT>::ElfHeader);
     if (Cmd.HasPhdrs)
       Phdr.add(Out<ELFT>::ProgramHeaders);
-
-    switch (Cmd.Type) {
-    case PT_INTERP:
-      if (Out<ELFT>::Interp)
-        Phdr.add(Out<ELFT>::Interp);
-      break;
-    case PT_DYNAMIC:
-      if (Out<ELFT>::DynSymTab) {
-        Phdr.H.p_flags = Out<ELFT>::Dynamic->getPhdrFlags();
-        Phdr.add(Out<ELFT>::Dynamic);
-      }
-      break;
-    case PT_GNU_EH_FRAME:
-      if (!Out<ELFT>::EhFrame->empty() && Out<ELFT>::EhFrameHdr) {
-        Phdr.H.p_flags = Out<ELFT>::EhFrameHdr->getPhdrFlags();
-        Phdr.add(Out<ELFT>::EhFrameHdr);
-      }
-      break;
-    }
   }
 
+  // Add output sections to program headers.
   PhdrEntry<ELFT> *Load = nullptr;
   uintX_t Flags = PF_R;
-  for (OutputSectionBase<ELFT> *Sec : Sections) {
+  for (OutputSectionBase<ELFT> *Sec : *OutputSections) {
     if (!(Sec->getFlags() & SHF_ALLOC))
       break;
 




More information about the llvm-commits mailing list