From 1b9e270b09c140464a7892c95c28eafa812c6b08 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 6 Oct 2018 00:05:51 +0930 Subject: [PATCH] No PT_INTERP when .interp is zero size Some targets don't set a default interpreter, resulting in an empty .interp section unless --dynamic-linker is passed to ld. A PT_INTERP without a path is rather useless. The testsuite change fixes a failure on microblaze-linux. bfd/ * elf.c (get_program_header_size): Don't count PT_INTERP if .interp is empty. (_bfd_elf_map_sections_to_segments): Don't create PT_INTERP if .interp is empty. ld/ * testsuite/ld-elf/pr22423.d: Pass --dynamic-linker to ld. --- bfd/ChangeLog | 7 +++++++ bfd/elf.c | 4 ++-- ld/ChangeLog | 4 ++++ ld/testsuite/ld-elf/pr22423.d | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 1b51db7..3d6796b 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,12 @@ 2018-10-08 Alan Modra + * elf.c (get_program_header_size): Don't count PT_INTERP if + .interp is empty. + (_bfd_elf_map_sections_to_segments): Don't create PT_INTERP if + .interp is empty. + +2018-10-08 Alan Modra + * elf32-spu.c (spu_elf_modify_segment_map): Don't insert overlays before segment containing headers. diff --git a/bfd/elf.c b/bfd/elf.c index b3ce110..fe43c9f 100644 --- a/bfd/elf.c +++ b/bfd/elf.c @@ -4335,7 +4335,7 @@ get_program_header_size (bfd *abfd, struct bfd_link_info *info) segs = 2; s = bfd_get_section_by_name (abfd, ".interp"); - if (s != NULL && (s->flags & SEC_LOAD) != 0) + if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->size != 0) { /* If we have a loadable interpreter section, we need a PT_INTERP segment. In this case, assume we also need a @@ -4647,7 +4647,7 @@ _bfd_elf_map_sections_to_segments (bfd *abfd, struct bfd_link_info *info) the program headers and a PT_INTERP segment for the .interp section. */ s = bfd_get_section_by_name (abfd, ".interp"); - if (s != NULL && (s->flags & SEC_LOAD) != 0) + if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->size != 0) { amt = sizeof (struct elf_segment_map); m = (struct elf_segment_map *) bfd_zalloc (abfd, amt); diff --git a/ld/ChangeLog b/ld/ChangeLog index b0c9eaa..7356c2b 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,7 @@ +2018-10-08 Alan Modra + + * testsuite/ld-elf/pr22423.d: Pass --dynamic-linker to ld. + 2018-10-05 Richard Henderson * testsuite/ld-or1k/or1k.exp: Add test cases for plt generation. diff --git a/ld/testsuite/ld-elf/pr22423.d b/ld/testsuite/ld-elf/pr22423.d index 70bd59e..9255c7e 100644 --- a/ld/testsuite/ld-elf/pr22423.d +++ b/ld/testsuite/ld-elf/pr22423.d @@ -1,6 +1,6 @@ #source: start.s #readelf: -l -W -#ld: -pie +#ld: -pie --dynamic-linker=/usr/lib/ld.so.1 #target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi #... -- 2.7.4