From: Alan Modra Date: Fri, 24 Apr 2015 09:49:37 +0000 (+0930) Subject: Non-alloc sections don't belong in PT_LOAD segments X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=44bd1acd55dcc15322a5c2d33442cd219ca320c7;p=binutils-gdb.git 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. ld/testsuite/ * ld-powerpc/tocnovar.d: Revert last change. --- diff --git a/include/elf/ChangeLog b/include/elf/ChangeLog index 2f2fc803caa..e4e094b231a 100644 --- a/include/elf/ChangeLog +++ b/include/elf/ChangeLog @@ -1,3 +1,8 @@ +2015-04-24 Alan Modra + + * internal.h (ELF_SECTION_IN_SEGMENT_1): Ensure PT_LOAD and + similar segments only contain alloc sections. + 2015-04-24 H.J. Lu PR binutils/18316 diff --git a/include/elf/internal.h b/include/elf/internal.h index b2492f55a2f..b49dd613940 100644 --- a/include/elf/internal.h +++ b/include/elf/internal.h @@ -325,6 +325,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 e58963e9bfa..de594c05a5f 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2015-04-24 Alan Modra + + * emultempl/ppc64elf.em (gld${EMULATION_NAME}_after_allocation): + Call gld${EMULATION_NAME}_map_segments regardless of need_laying_out. + 2015-04-24 DJ Delorie * Makefile.am (msp430): Rename primary emulation to msp430elf. diff --git a/ld/emultempl/ppc64elf.em b/ld/emultempl/ppc64elf.em index fd9a3cece5e..2d26a957bd9 100644 --- a/ld/emultempl/ppc64elf.em +++ b/ld/emultempl/ppc64elf.em @@ -546,13 +546,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); } diff --git a/ld/testsuite/ChangeLog b/ld/testsuite/ChangeLog index 18516a2bc2c..db467a9d89c 100644 --- a/ld/testsuite/ChangeLog +++ b/ld/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-04-24 Alan Modra + + * ld-powerpc/tocnovar.d: Revert last change. + 2015-04-24 Richard Earnshaw * ld-arm/armthumb-lib.d: Regenerate expected output. diff --git a/ld/testsuite/ld-powerpc/tocnovar.d b/ld/testsuite/ld-powerpc/tocnovar.d index 475617a2777..d1fd258b4fe 100644 --- a/ld/testsuite/ld-powerpc/tocnovar.d +++ b/ld/testsuite/ld-powerpc/tocnovar.d @@ -11,4 +11,4 @@ #... +00 +\.text +01 +\.opd \.got - +02 +\.opd \.got .* + +02 +\.opd \.got