aboutsummaryrefslogtreecommitdiff
path: root/bfd/elf.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2018-02-26 08:16:24 +1030
committerAlan Modra <amodra@gmail.com>2018-02-26 10:51:12 +1030
commit6838f2bed6459514c1b0c549e6aa3fc7dbb1d7ec (patch)
tree6a208a96143d2826c120abb1083e21e501a5e609 /bfd/elf.c
parentdf5f2391f7b2e3cab7e677ab7dadd02aef06e269 (diff)
downloadbinutils-6838f2bed6459514c1b0c549e6aa3fc7dbb1d7ec.zip
binutils-6838f2bed6459514c1b0c549e6aa3fc7dbb1d7ec.tar.gz
binutils-6838f2bed6459514c1b0c549e6aa3fc7dbb1d7ec.tar.bz2
Segfault on phdrs allocated but not created
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.
Diffstat (limited to 'bfd/elf.c')
-rw-r--r--bfd/elf.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/bfd/elf.c b/bfd/elf.c
index 184ab31..5d39a98 100644
--- 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;
}