PR23207, hppa ld SIGSEGVs on invalid object files
authorAlan Modra <amodra@gmail.com>
Tue, 22 May 2018 09:04:18 +0000 (18:34 +0930)
committerAlan Modra <amodra@gmail.com>
Tue, 22 May 2018 10:07:06 +0000 (19:37 +0930)
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
bfd/elf32-hppa.c

index b4caff91166aa97a007c8adea3933a2392348d5c..1f6a85f7e07e29e5f339aeeb8b68fe44e5ae287d 100644 (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>
 
        PR 23207
index 5ad49abfe071bd84c32481603cb9a2ba6a2c6a6d..efab20fbd368249903b4487e1bab1fce02e0dbd3 100644 (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
      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);