From 1a4839f89446137089f2b45e17ddb28793262629 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Mon, 18 Mar 2019 23:32:22 +1030 Subject: PR24355, segmentation fault in function called from ppc_finish_symbols 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 | 7 +++++++ bfd/elf32-ppc.c | 13 +++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2c1c75cb334..f5a8af82e13 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2019-03-18 Alan Modra + + 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 PR ld/23324 diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 16ee60fb0ee..7c6a96a8903 100644 --- a/bfd/elf32-ppc.c +++ b/bfd/elf32-ppc.c @@ -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)); } } -- cgit v1.2.1