This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb/binutils-2_25-branch] Non-alloc sections don't belong in PT_LOAD segments


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=69ce3f1e12979420bbc699e791a403cbeb28740e

commit 69ce3f1e12979420bbc699e791a403cbeb28740e
Author: Alan Modra <amodra@gmail.com>
Date:   Fri Apr 24 19:19:37 2015 +0930

    Non-alloc sections don't belong in PT_LOAD segments
    
    Taking them out showed a bug in the powerpc64 backend with .branch_lt
    being removed from output_bfd but not from previously set up segment
    section maps.  Removing the bfd sections meant their sh_flags (and
    practically everything else) remaining zero, ie. not SHF_ALLOC,
    triggering complaints about "`.branch_lt' can't be allocated in
    segment".
    
    include/elf/
    	* internal.h (ELF_SECTION_IN_SEGMENT_1): Ensure PT_LOAD and
    	similar segments only contain alloc sections.
    ld/
    	* emultempl/ppc64elf.em (gld${EMULATION_NAME}_after_allocation):
    	Call gld${EMULATION_NAME}_map_segments regardless of need_laying_out.

Diff:
---
 include/elf/ChangeLog    |  7 +++++++
 include/elf/internal.h   |  7 +++++++
 ld/ChangeLog             |  4 ++++
 ld/emultempl/ppc64elf.em | 17 ++++++++++-------
 4 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog
index 17978ba..4b9e0ae 100644
--- a/include/elf/ChangeLog
+++ b/include/elf/ChangeLog
@@ -1,3 +1,10 @@
+2015-07-10  Alan Modra  <amodra@gmail.com>
+
+	Apply from master
+	2015-04-24  Alan Modra  <amodra@gmail.com>
+	* internal.h (ELF_SECTION_IN_SEGMENT_1): Ensure PT_LOAD and
+	similar segments only contain alloc sections.
+
 2014-10-09  Jose E. Marchesi  <jose.marchesi@oracle.com>
 
 	* sparc.h (Tag_GNU_Sparc_HWCAPS2): New object attribute.
diff --git a/include/elf/internal.h b/include/elf/internal.h
index 310c1d9..eb062df 100644
--- a/include/elf/internal.h
+++ b/include/elf/internal.h
@@ -317,6 +317,13 @@ struct elf_segment_map
     || (((sec_hdr)->sh_flags & SHF_TLS) == 0				\
 	&& (segment)->p_type != PT_TLS					\
 	&& (segment)->p_type != PT_PHDR))				\
+   /* PT_LOAD and similar segments only have SHF_ALLOC sections.  */	\
+   && !(((sec_hdr)->sh_flags & SHF_ALLOC) == 0				\
+	&& ((segment)->p_type == PT_LOAD				\
+	    || (segment)->p_type == PT_DYNAMIC				\
+	    || (segment)->p_type == PT_GNU_EH_FRAME			\
+	    || (segment)->p_type == PT_GNU_RELRO			\
+	    || (segment)->p_type == PT_GNU_STACK))			\
    /* Any section besides one of type SHT_NOBITS must have file		\
       offsets within the segment.  */					\
    && ((sec_hdr)->sh_type == SHT_NOBITS					\
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 40193ba..0794b25 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,6 +1,10 @@
 2015-07-10  Alan Modra  <amodra@gmail.com>
 
 	Apply from master.
+	2015-04-24  Alan Modra  <amodra@gmail.com>
+	* emultempl/ppc64elf.em (gld${EMULATION_NAME}_after_allocation):
+	Call gld${EMULATION_NAME}_map_segments regardless of need_laying_out.
+
 	2015-04-23  Alan Modra  <amodra@gmail.com>
 	* emulparams/elf64ppc.sh (GOT): Align.
 
diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em
index 9646903..63a2e5d 100644
--- a/ld/emultempl/ppc64elf.em
+++ b/ld/emultempl/ppc64elf.em
@@ -509,13 +509,16 @@ gld${EMULATION_NAME}_after_allocation (void)
   else if (ret > 0)
     need_laying_out = 1;
 
-  if (need_laying_out != -1)
-    {
-      gld${EMULATION_NAME}_map_segments (need_laying_out);
-
-      if (!link_info.relocatable)
-	ppc64_elf_set_toc (&link_info, link_info.output_bfd);
-    }
+  /* Call map_segments regardless of the state of need_laying_out.
+     need_laying_out set to -1 means we have just laid everything out,
+     but ppc64_elf_size_stubs strips .branch_lt and .eh_frame if
+     unneeded, after ppc_layout_sections_again.  Another call removes
+     these sections from the segment map.  Their presence is
+     innocuous except for confusing ELF_SECTION_IN_SEGMENT.  */
+  gld${EMULATION_NAME}_map_segments (need_laying_out > 0);
+
+  if (need_laying_out != -1 && !link_info.relocatable)
+    ppc64_elf_set_toc (&link_info, link_info.output_bfd);
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]