diff options
author | Alan Modra <amodra@gmail.com> | 2019-03-18 23:32:22 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2019-03-18 23:37:21 +1030 |
commit | 1a4839f89446137089f2b45e17ddb28793262629 (patch) | |
tree | 2c288af291fc3f91039831f841181f029d58a13e | |
parent | c6f021093dbd26b4d8e761e9a19af817e9f2561f (diff) | |
download | fsf-binutils-gdb-binutils-2_30-branch.zip fsf-binutils-gdb-binutils-2_30-branch.tar.gz fsf-binutils-gdb-binutils-2_30-branch.tar.bz2 |
PR24355, segmentation fault in function called from ppc_finish_symbolsbinutils-2_30-branch
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.
-rw-r--r-- | bfd/ChangeLog | 7 | ||||
-rw-r--r-- | bfd/elf32-ppc.c | 13 |
2 files changed, 12 insertions, 8 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 2c1c75c..f5a8af8 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -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 diff --git a/bfd/elf32-ppc.c b/bfd/elf32-ppc.c index 16ee60f..7c6a96a 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)); } } |