This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: PR23207, hppa ld SIGSEGVs on invalid object files
- From: Alan Modra <amodra at gmail dot com>
- To: binutils at sourceware dot org
- Date: Tue, 22 May 2018 22:20:57 +0930
- Subject: Re: PR23207, hppa ld SIGSEGVs on invalid object files
- References: <20180522055626.GX23663@bubble.grove.modra.org>
On Tue, May 22, 2018 at 03:26:26PM +0930, Alan Modra wrote:
> PR 23207
> * elf32-hppa.c (final_link_relocate): Don't look for plt call
> stubs in non-alloc sections.
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.
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);
--
Alan Modra
Australia Development Lab, IBM