From 215f527155ea776fff3f2f836d5da1e300e8c370 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 22 May 2018 18:34:18 +0930 Subject: [PATCH] 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. --- bfd/ChangeLog | 9 +++++++++ bfd/elf32-hppa.c | 24 ++++++++++++++---------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index b4caff9116..1f6a85f7e0 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2018-05-22 Alan Modra + + 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 PR 23207 diff --git a/bfd/elf32-hppa.c b/bfd/elf32-hppa.c index 5ad49abfe0..efab20fbd3 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); -- 2.34.1