diff options
author | Alan Modra <amodra@gmail.com> | 2018-05-22 18:34:18 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2018-05-22 19:37:06 +0930 |
commit | 215f527155ea776fff3f2f836d5da1e300e8c370 (patch) | |
tree | c4258ef6d72973da9348b87f3c371eee4b6d0134 /bfd | |
parent | PR23207, hppa ld SIGSEGVs on invalid object files (diff) | |
download | binutils-gdb-215f527155ea776fff3f2f836d5da1e300e8c370.tar.gz binutils-gdb-215f527155ea776fff3f2f836d5da1e300e8c370.tar.bz2 binutils-gdb-215f527155ea776fff3f2f836d5da1e300e8c370.zip |
PR23207, hppa ld SIGSEGVs on invalid object files
The last patch was enough to cure the testcase, but not the original
object file. This patch does the same for hppa as is done for ppc64,
simply test for the section belonging to a group. I've also
restricted stubs to load, alloc, code sections.
PR 23207
* elf32-hppa.c (hppa_get_stub_entry): Return NULL when link_sec
is NULL.
(elf32_hppa_size_stubs): Only create stubs for load, alloc, code
sections.
(final_link_relocate): Revert last change.
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 9 | ||||
-rw-r--r-- | bfd/elf32-hppa.c | 24 |
2 files changed, 23 insertions, 10 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b4caff91166..1f6a85f7e07 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,6 +1,15 @@ 2018-05-22 Alan Modra <amodra@gmail.com> PR 23207 + * elf32-hppa.c (hppa_get_stub_entry): Return NULL when link_sec + is NULL. + (elf32_hppa_size_stubs): Only create stubs for load, alloc, code + sections. + (final_link_relocate): Revert last change. + +2018-05-22 Alan Modra <amodra@gmail.com> + + PR 23207 * elf32-hppa.c (final_link_relocate): Don't look for plt call stubs in non-alloc sections. diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 5ad49abfe07..efab20fbd36 100644 --- a/bfd/elf32-hppa.c +++ b/bfd/elf32-hppa.c @@ -503,6 +503,8 @@ hppa_get_stub_entry (const asection *input_section, more than one stub used to reach say, printf, and we need to distinguish between them. */ id_sec = htab->stub_group[input_section->id].link_sec; + if (id_sec == NULL) + return NULL; if (hh != NULL && hh->hsh_cache != NULL && hh->hsh_cache->hh == hh @@ -2795,6 +2797,9 @@ elf32_hppa_size_stubs /* If there aren't any relocs, then there's nothing more to do. */ if ((section->flags & SEC_RELOC) == 0 + || (section->flags & SEC_ALLOC) == 0 + || (section->flags & SEC_LOAD) == 0 + || (section->flags & SEC_CODE) == 0 || section->reloc_count == 0) continue; @@ -3267,16 +3272,15 @@ final_link_relocate (asection *input_section, case R_PARISC_PCREL22F: /* If this call should go via the plt, find the import stub in the stub hash. */ - if ((input_section->flags & SEC_ALLOC) != 0 - && (sym_sec == NULL - || sym_sec->output_section == NULL - || (hh != NULL - && hh->eh.plt.offset != (bfd_vma) -1 - && hh->eh.dynindx != -1 - && !hh->plabel - && (bfd_link_pic (info) - || !hh->eh.def_regular - || hh->eh.root.type == bfd_link_hash_defweak)))) + if (sym_sec == NULL + || sym_sec->output_section == NULL + || (hh != NULL + && hh->eh.plt.offset != (bfd_vma) -1 + && hh->eh.dynindx != -1 + && !hh->plabel + && (bfd_link_pic (info) + || !hh->eh.def_regular + || hh->eh.root.type == bfd_link_hash_defweak))) { hsh = hppa_get_stub_entry (input_section, sym_sec, hh, rela, htab); |