Fix the linker so that it will not silently generate ELF binaries with invalid progra...
authorNick Clifton <nickc@redhat.com>
Wed, 23 Nov 2016 11:10:39 +0000 (11:10 +0000)
committerNick Clifton <nickc@redhat.com>
Wed, 23 Nov 2016 11:10:39 +0000 (11:10 +0000)
commit1a9ccd70f9a75dc6b48d340059f28ef3550c107b
treea270b05984cd44808359c6f6773ce0dfa5d3dff7
parent128e85e3ab36b8e30f6612fb50de3cbb4ede6824
Fix the linker so that it will not silently generate ELF binaries with invalid program headers.  Fix readelf to report such invalid binaries.

PR ld/20815
bfd * elf.c (elf_modify_segment_map): Allow empty LOAD segments if
they contain the program headers.
(_bfd_elf_map_sections_to_segments): If the linker created the
PHDR segment then always attempt to include it in a LOAD segment.
(assign_file_positions_for_non_load_sections): Allow LOAD segments
to overlap PHDR segments.
(phdr_sorter): New function.  Sorts program headers.
(assign_file_positions_except_relocs): Sort the program headers
before writing them out.  Issue an error if the PHDR segment is
not covered by a LOAD segment, unless the backend allows it.
* elf-bfd.h (struct elf_backend_data): Add
elf_backend_allow_non_load_phdr.
* elfxx-target.h (elf_backend_allow_non_load_phdr): Provide
default definition that returns FALSE.
(elfNN_bed): Initialise the elf_backend_allow_non_load_phdr
field.
* elf64-hppa.c (elf64_hppa_allow_non_load_phdr): New function.
Returns TRUE.
(elf_backend_allow_non_load_phdr): Define.
* elf-m10300.c (_bfd_mn10300_elf_size_dynamic_sections): Do not
place the interpreter string into the .interp section if the
nointerp flag is set in the link info structure.
* elf32-arc.c (elf_arc_size_dynamic_sections): Likewise.
* elf32-score7.c (score_elf_final_link_relocate): Allow for the
_gp symbol not being part of the output.

binutils* readelf.c (process_program_headers): Check PT_LOAD and PT_PHDR
segments for validity.

ld * ld.texinfo: Note that PT_TLS can be used as a segment type.
* testsuite/ld-discard/discard.ld: Add space for program headers.
* testsuite/ld-elf/flags1.ld: Likewise.
* testsuite/ld-elf/maxpage3.t: Likewise.
* testsuite/ld-elf/noload-1.t: Likewise.
* testsuite/ld-elf/orphan.ld: Likewise.
* testsuite/ld-elf/overlay.t: Likewise.
* testsuite/ld-elf/pr14052.t: Likewise.
* testsuite/ld-elf/pr19539.t: Likewise.
* testsuite/ld-elf/provide-hidden-1.ld: Likewise.
* testsuite/ld-elf/provide-hidden-s.ld: Likewise.
* testsuite/ld-elf/weak-dyn-1.ld: Likewise.
* testsuite/ld-i386/pr19539.t: Likewise.
* testsuite/ld-scripts/defined.t: Likewise.
* testsuite/ld-scripts/defined6.t: Likewise.
* testsuite/ld-scripts/dynamic-sections.t: Likewise.
* testsuite/ld-scripts/empty-aligned.t: Likewise.
* testsuite/ld-scripts/provide-2.t: Likewise.
* testsuite/ld-scripts/provide-4.t: Likewise.
* testsuite/ld-vax-elf/plt-local.ld: Likewise.
* testsuite/ld-x86-64/pr19539.t: Likewise.
* testsuite/ld-elf/ehdr_start-missing.d: Do not initialise the
dynamic linker.
* testsuite/ld-elf/ehdr_start-weak.d: Likewise.
* testsuite/ld-elf/elf.exp (pr14170, pr17068): Likewise.
* testsuite/ld-elf/loadaddr1.d: Update expected readelf output.
* testsuite/ld-elf/noload-2.d: Likewise.
* testsuite/ld-powerpc/vxworks2.sd: Likewise.
* testsuite/ld-scripts/phdrs3a.d: Likewise.
* testsuite/ld-scripts/size-2.d: Likewise.
* testsuite/ld-elf/group.ld: Add program headers.
* testsuite/ld-elf/overlay.d: Skip for SPU.
* testsuite/ld-elf/flags1.d: Skip for RX.
* testsuite/ld-elf/pr19162.d: Skip for HPPA64.
* testsuite/ld-elf/pr19539.d: Skip for ALPHA.
* testsuite/ld-scripts/empty-orphan.t: Update program headers.
* testsuite/ld-scripts/size-2.t: Likewise.
48 files changed:
bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf-m10300.c
bfd/elf.c
bfd/elf32-arc.c
bfd/elf32-score7.c
bfd/elf64-hppa.c
bfd/elfcode.h
bfd/elfxx-target.h
binutils/ChangeLog
binutils/readelf.c
ld/ChangeLog
ld/ld.texinfo
ld/testsuite/ld-discard/discard.ld
ld/testsuite/ld-elf/ehdr_start-missing.d
ld/testsuite/ld-elf/ehdr_start-weak.d
ld/testsuite/ld-elf/elf.exp
ld/testsuite/ld-elf/flags1.d
ld/testsuite/ld-elf/flags1.ld
ld/testsuite/ld-elf/group.ld
ld/testsuite/ld-elf/loadaddr1.d
ld/testsuite/ld-elf/maxpage3.t
ld/testsuite/ld-elf/noload-1.t
ld/testsuite/ld-elf/noload-2.d
ld/testsuite/ld-elf/orphan.ld
ld/testsuite/ld-elf/overlay.d
ld/testsuite/ld-elf/overlay.t
ld/testsuite/ld-elf/pr14052.t
ld/testsuite/ld-elf/pr19162.d
ld/testsuite/ld-elf/pr19539.d
ld/testsuite/ld-elf/pr19539.t
ld/testsuite/ld-elf/provide-hidden-1.ld
ld/testsuite/ld-elf/provide-hidden-s.ld
ld/testsuite/ld-elf/weak-dyn-1.ld
ld/testsuite/ld-i386/pr19539.t
ld/testsuite/ld-powerpc/vxworks2.sd
ld/testsuite/ld-scripts/defined.t
ld/testsuite/ld-scripts/defined6.t
ld/testsuite/ld-scripts/dynamic-sections.t
ld/testsuite/ld-scripts/empty-aligned.t
ld/testsuite/ld-scripts/empty-orphan.t
ld/testsuite/ld-scripts/phdrs3a.d
ld/testsuite/ld-scripts/provide-2.t
ld/testsuite/ld-scripts/provide-4.t
ld/testsuite/ld-scripts/size-2.d
ld/testsuite/ld-scripts/size-2.t
ld/testsuite/ld-vax-elf/plt-local.ld
ld/testsuite/ld-x86-64/pr19539.t