[binutils-gdb/binutils-2_30-branch] PR24355, segmentation fault in function called from ppc_finish_symbols
Alan Modra
amodra@sourceware.org
Mon Mar 18 13:08:00 GMT 2019
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=1a4839f89446137089f2b45e17ddb28793262629
commit 1a4839f89446137089f2b45e17ddb28793262629
Author: Alan Modra <amodra@gmail.com>
Date: Mon Mar 18 23:32:22 2019 +1030
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.
Diff:
---
bfd/ChangeLog | 7 +++++++
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));
}
}
More information about the Binutils-cvs
mailing list