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.
This commit is contained in:
parent
df5f2391f7
commit
6838f2bed6
|
@ -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>
|
2018-02-26 Alan Modra <amodra@gmail.com>
|
||||||
|
|
||||||
* elf-m10300.c, * elf-s390-common.c, * elf32-arc.c, * elf32-cris.c,
|
* elf-m10300.c, * elf-s390-common.c, * elf32-arc.c, * elf32-cris.c,
|
||||||
|
|
12
bfd/elf.c
12
bfd/elf.c
|
@ -6127,9 +6127,7 @@ assign_file_positions_except_relocs (bfd *abfd,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write out the program headers. */
|
/* Write out the program headers. */
|
||||||
alloc = elf_program_header_size (abfd) / bed->s->sizeof_phdr;
|
alloc = elf_elfheader (abfd)->e_phnum;
|
||||||
|
|
||||||
/* Sort the program headers into the ordering required by the ELF standard. */
|
|
||||||
if (alloc == 0)
|
if (alloc == 0)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
@ -6151,14 +6149,14 @@ assign_file_positions_except_relocs (bfd *abfd,
|
||||||
alloc))
|
alloc))
|
||||||
&& tdata->phdr[1].p_type == PT_LOAD
|
&& tdata->phdr[1].p_type == PT_LOAD
|
||||||
&& (tdata->phdr[1].p_vaddr > tdata->phdr[0].p_vaddr
|
&& (tdata->phdr[1].p_vaddr > tdata->phdr[0].p_vaddr
|
||||||
|| (tdata->phdr[1].p_vaddr + tdata->phdr[1].p_memsz)
|
|| (tdata->phdr[1].p_vaddr + tdata->phdr[1].p_memsz
|
||||||
< (tdata->phdr[0].p_vaddr + tdata->phdr[0].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
|
/* The fix for this error is usually to edit the linker script being
|
||||||
used and set up the program headers manually. Either that or
|
used and set up the program headers manually. Either that or
|
||||||
leave room for the headers at the start of the SECTIONS. */
|
leave room for the headers at the start of the SECTIONS. */
|
||||||
_bfd_error_handler (_("\
|
_bfd_error_handler (_("%pB: error: PHDR segment not covered"
|
||||||
%pB: error: PHDR segment not covered by LOAD segment"),
|
" by LOAD segment"),
|
||||||
abfd);
|
abfd);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue