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.
This commit is contained in:
Alan Modra 2018-05-22 18:34:18 +09:30
parent 7455c018e4
commit 215f527155
2 changed files with 23 additions and 10 deletions

View File

@ -1,3 +1,12 @@
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> 2018-05-22 Alan Modra <amodra@gmail.com>
PR 23207 PR 23207

View File

@ -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 more than one stub used to reach say, printf, and we need to
distinguish between them. */ distinguish between them. */
id_sec = htab->stub_group[input_section->id].link_sec; id_sec = htab->stub_group[input_section->id].link_sec;
if (id_sec == NULL)
return NULL;
if (hh != NULL && hh->hsh_cache != NULL if (hh != NULL && hh->hsh_cache != NULL
&& hh->hsh_cache->hh == hh && hh->hsh_cache->hh == hh
@ -2795,6 +2797,9 @@ elf32_hppa_size_stubs
/* If there aren't any relocs, then there's nothing more /* If there aren't any relocs, then there's nothing more
to do. */ to do. */
if ((section->flags & SEC_RELOC) == 0 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) || section->reloc_count == 0)
continue; continue;
@ -3267,16 +3272,15 @@ final_link_relocate (asection *input_section,
case R_PARISC_PCREL22F: case R_PARISC_PCREL22F:
/* If this call should go via the plt, find the import stub in /* If this call should go via the plt, find the import stub in
the stub hash. */ the stub hash. */
if ((input_section->flags & SEC_ALLOC) != 0 if (sym_sec == NULL
&& (sym_sec == NULL || sym_sec->output_section == NULL
|| sym_sec->output_section == NULL || (hh != NULL
|| (hh != NULL && hh->eh.plt.offset != (bfd_vma) -1
&& hh->eh.plt.offset != (bfd_vma) -1 && hh->eh.dynindx != -1
&& hh->eh.dynindx != -1 && !hh->plabel
&& !hh->plabel && (bfd_link_pic (info)
&& (bfd_link_pic (info) || !hh->eh.def_regular
|| !hh->eh.def_regular || hh->eh.root.type == bfd_link_hash_defweak)))
|| hh->eh.root.type == bfd_link_hash_defweak))))
{ {
hsh = hppa_get_stub_entry (input_section, sym_sec, hsh = hppa_get_stub_entry (input_section, sym_sec,
hh, rela, htab); hh, rela, htab);