diff options
author | Alan Modra <amodra@gmail.com> | 2015-04-24 19:19:37 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2015-07-10 19:57:37 +0930 |
commit | 69ce3f1e12979420bbc699e791a403cbeb28740e (patch) | |
tree | c9875634a4c2ec2b3093de2ea3e4db1e829a1728 | |
parent | 143e21ad43a55246809636b975891ec64250246d (diff) | |
download | gdb-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/ChangeLog | 7 | ||||
-rw-r--r-- | include/elf/internal.h | 7 | ||||
-rw-r--r-- | ld/ChangeLog | 4 | ||||
-rw-r--r-- | 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); } |