]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
PR24355, segmentation fault in function called from ppc_finish_symbols binutils-2_30-branch
authorAlan Modra <amodra@gmail.com>
Mon, 18 Mar 2019 13:02:22 +0000 (23:32 +1030)
committerAlan Modra <amodra@gmail.com>
Mon, 18 Mar 2019 13:07:21 +0000 (23:37 +1030)
Backport to 2.30, where the problem might be triggered by gc-sections
rather than inline PLT optimization as in the PR.

PR 24355
* elf32-ppc.c (ppc_elf_relocate_section): Don't call write_glink_stub
for local iplt syms with ent->plt.offset == -1.  Remove ineffective
attempt at writing glink stubs only once.  Correct plt.offset mask.

bfd/ChangeLog
bfd/elf32-ppc.c

index 2c1c75cb334250fede439e0867b27e984fad9e00..f5a8af82e13587675b6ce6389b058463c31f3935 100644 (file)
@@ -1,3 +1,10 @@
+2019-03-18  Alan Modra  <amodra@gmail.com>
+
+       PR 24355
+       * elf32-ppc.c (ppc_elf_relocate_section): Don't call write_glink_stub
+       for local iplt syms with ent->plt.offset == -1.  Remove ineffective
+       attempt at writing glink stubs only once.  Correct plt.offset mask.
+
 2018-07-04  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR ld/23324
index 16ee60fb0ee4327db364d1f8e04d3462a02016c5..7c6a96a89033a594dabec7d9ab522e73ffecbb17 100644 (file)
@@ -8259,6 +8259,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
                {
                  Elf_Internal_Rela rela;
                  bfd_byte *loc;
+                 unsigned char *p;
 
                  rela.r_offset = (htab->elf.iplt->output_section->vma
                                   + htab->elf.iplt->output_offset
@@ -8272,14 +8273,10 @@ ppc_elf_relocate_section (bfd *output_bfd,
                  htab->local_ifunc_resolver = 1;
 
                  ent->plt.offset |= 1;
-               }
-             if (h == NULL && (ent->glink_offset & 1) == 0)
-               {
-                 unsigned char *p = ((unsigned char *) htab->glink->contents
-                                     + ent->glink_offset);
 
+                 p = ((unsigned char *) htab->glink->contents
+                      + ent->glink_offset);
                  write_glink_stub (NULL, ent, htab->elf.iplt, p, info);
-                 ent->glink_offset |= 1;
                }
 
              unresolved_reloc = FALSE;
@@ -8289,11 +8286,11 @@ ppc_elf_relocate_section (bfd *output_bfd,
                  || h->dynindx == -1)
                relocation = (htab->glink->output_section->vma
                              + htab->glink->output_offset
-                             + (ent->glink_offset & ~1));
+                             + ent->glink_offset);
              else
                relocation = (htab->elf.splt->output_section->vma
                              + htab->elf.splt->output_offset
-                             + ent->plt.offset);
+                             + (ent->plt.offset & ~1));
            }
        }