PR23207, hppa ld SIGSEGVs on invalid object files
authorAlan Modra <amodra@gmail.com>
Mon, 21 May 2018 11:59:25 +0000 (21:29 +0930)
committerAlan Modra <amodra@gmail.com>
Tue, 22 May 2018 05:15:15 +0000 (14:45 +0930)
We don't create PLT call stubs for anything in non-alloc sections,
so it doesn't pay to go looking for them.  The problem is that
non-alloc sections aren't processed by group_sections and thus don't
get a link_sec set up for them.

PR 23207
* elf32-hppa.c (final_link_relocate): Don't look for plt call
stubs in non-alloc sections.

bfd/ChangeLog
bfd/elf32-hppa.c

index 0af7a24623bdd80a8d030fc0e88df940da0f0420..b4caff91166aa97a007c8adea3933a2392348d5c 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2018-05-21  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/23201
index 722452b5af7fda2f889245109e9b3418e3e99eeb..5ad49abfe071bd84c32481603cb9a2ba6a2c6a6d 100644 (file)
@@ -3267,18 +3267,19 @@ 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 (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 ((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))))
        {
          hsh = hppa_get_stub_entry (input_section, sym_sec,
-                                           hh, rela, htab);
+                                    hh, rela, htab);
          if (hsh != NULL)
            {
              value = (hsh->stub_offset
@@ -3478,7 +3479,7 @@ final_link_relocate (asection *input_section,
       if (value + addend + max_branch_offset >= 2*max_branch_offset)
        {
          hsh = hppa_get_stub_entry (input_section, sym_sec,
-                                           hh, rela, htab);
+                                    hh, rela, htab);
          if (hsh == NULL)
            return bfd_reloc_undefined;