Segfault on phdrs allocated but not created
authorAlan Modra <amodra@gmail.com>
Sun, 25 Feb 2018 21:46:24 +0000 (08:16 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 26 Feb 2018 00:21:12 +0000 (10:51 +1030)
A number of ARM tests show results like:
ld-new: no address assigned to the veneers output section .gnu.sgstubs
ld-new: can not size stub section: invalid operation
ld-new: warning: cannot find entry symbol _start; defaulting to 0000000000010074
ld-new: tmpdir/cmse-veneers-no-gnu_sgstubs: warning: allocated section `.text' not in segment
Segmentation fault
PASS: Secure gateway veneers: no .gnu.sgstubs section

The PASS despite the segv shows the danger of using "#..." to match
error output.  This patch doesn't try to fix the testuite, but does
prevent the segfault.

* elf.c (assign_file_positions_except_relocs): Don't segfault
when actual number of phdrs is less than allocated.  Delete
outdated comment.  Formatting.

bfd/ChangeLog
bfd/elf.c

index 68527a31f0127f80d814d768376116db2ab69af5..15aa4ee174c87bde3bab5a45cb925fc73aa163d5 100644 (file)
@@ -1,3 +1,9 @@
+2018-02-26  Alan Modra  <amodra@gmail.com>
+
+       * elf.c (assign_file_positions_except_relocs): Don't segfault
+       when actual number of phdrs is less than allocated.  Delete
+       outdated comment.  Formatting.
+
 2018-02-26  Alan Modra  <amodra@gmail.com>
 
        * elf-m10300.c, * elf-s390-common.c, * elf32-arc.c, * elf32-cris.c,
index 184ab31f41342b92763bba43d0d4b9d1849613d6..5d39a9881d59d433875c6fc46d8a26a8c6c9998b 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -6127,9 +6127,7 @@ assign_file_positions_except_relocs (bfd *abfd,
        }
 
       /* Write out the program headers.  */
-      alloc = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
-
-      /* Sort the program headers into the ordering required by the ELF standard.  */
+      alloc = elf_elfheader (abfd)->e_phnum;
       if (alloc == 0)
        return TRUE;
 
@@ -6151,14 +6149,14 @@ assign_file_positions_except_relocs (bfd *abfd,
                                                        alloc))
          && tdata->phdr[1].p_type == PT_LOAD
          && (tdata->phdr[1].p_vaddr > tdata->phdr[0].p_vaddr
-             || (tdata->phdr[1].p_vaddr + tdata->phdr[1].p_memsz)
-             <  (tdata->phdr[0].p_vaddr + tdata->phdr[0].p_memsz)))
+             || (tdata->phdr[1].p_vaddr + tdata->phdr[1].p_memsz
+                 < tdata->phdr[0].p_vaddr + tdata->phdr[0].p_memsz)))
        {
          /* The fix for this error is usually to edit the linker script being
             used and set up the program headers manually.  Either that or
             leave room for the headers at the start of the SECTIONS.  */
-         _bfd_error_handler (_("\
-%pB: error: PHDR segment not covered by LOAD segment"),
+         _bfd_error_handler (_("%pB: error: PHDR segment not covered"
+                               " by LOAD segment"),
                              abfd);
          return FALSE;
        }