aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2015-04-24 19:19:37 +0930
committerAlan Modra <amodra@gmail.com>2015-07-10 19:57:37 +0930
commit69ce3f1e12979420bbc699e791a403cbeb28740e (patch)
treec9875634a4c2ec2b3093de2ea3e4db1e829a1728
parent143e21ad43a55246809636b975891ec64250246d (diff)
downloadgdb-69ce3f1e12979420bbc699e791a403cbeb28740e.zip
gdb-69ce3f1e12979420bbc699e791a403cbeb28740e.tar.gz
gdb-69ce3f1e12979420bbc699e791a403cbeb28740e.tar.bz2
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.
-rw-r--r--include/elf/ChangeLog7
-rw-r--r--include/elf/internal.h7
-rw-r--r--ld/ChangeLog4
-rw-r--r--ld/emultempl/ppc64elf.em17
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);
}