This is the mail archive of the
binutils-cvs@sourceware.org
mailing list for the binutils project.
[binutils-gdb] PowerPC64 debian bug 886264, out-of-line save/restore functions
- From: Alan Modra <amodra at sourceware dot org>
- To: bfd-cvs at sourceware dot org
- Date: 14 Mar 2018 12:03:22 -0000
- Subject: [binutils-gdb] PowerPC64 debian bug 886264, out-of-line save/restore functions
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=7dda8d3cf3b089bb7e03c4cdbec827fc6a188c88
commit 7dda8d3cf3b089bb7e03c4cdbec827fc6a188c88
Author: Alan Modra <amodra@gmail.com>
Date: Wed Mar 14 22:09:33 2018 +1030
PowerPC64 debian bug 886264, out-of-line save/restore functions
This calculation in relocate_section
if (stub_entry->stub_type == ppc_stub_save_res)
relocation += (stub_sec->output_offset
+ stub_sec->output_section->vma
+ stub_sec->size - htab->sfpr->size
- htab->sfpr->output_offset
- htab->sfpr->output_section->vma);
to adjust from the original out-of-line save/restore function address
in sfpr to a copy at the end of stub_sec goes wrong when stub_sec is
padded, because the copy is no longer at the end of stub_sec. The
solution is to pad before copying sfpr, so the copy is always at the
end of stub_sec.
* elf64-ppc.c (sfpr_define): Adjust for stub_sec size having
sfpr size added before defining alias symbols.
(ppc64_elf_build_stubs): Add stub section padding before
copying sfpr contents and defining save/restore alias symbols.
Diff:
---
bfd/ChangeLog | 7 +++++++
bfd/elf64-ppc.c | 33 ++++++++++++++++++---------------
2 files changed, 25 insertions(+), 15 deletions(-)
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index ad971fc..fac9b62 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2018-03-14 Alan Modra <amodra@gmail.com>
+
+ * elf64-ppc.c (sfpr_define): Adjust for stub_sec size having
+ sfpr size added before defining alias symbols.
+ (ppc64_elf_build_stubs): Add stub section padding before
+ copying sfpr contents and defining save/restore alias symbols.
+
2018-03-14 H.J. Lu <hongjiu.lu@intel.com>
PR ld/20882
diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c
index 44237bc..889bdb0 100644
--- a/bfd/elf64-ppc.c
+++ b/bfd/elf64-ppc.c
@@ -6660,7 +6660,7 @@ sfpr_define (struct bfd_link_info *info,
{
s->root.type = bfd_link_hash_defined;
s->root.u.def.section = stub_sec;
- s->root.u.def.value = (stub_sec->size
+ s->root.u.def.value = (stub_sec->size - htab->sfpr->size
+ h->elf.root.u.def.value);
s->ref_regular = 1;
s->def_regular = 1;
@@ -13247,20 +13247,7 @@ ppc64_elf_build_stubs (struct bfd_link_info *info,
for (group = htab->group; group != NULL; group = group->next)
if (group->needs_save_res)
- {
- stub_sec = group->stub_sec;
- memcpy (stub_sec->contents + stub_sec->size, htab->sfpr->contents,
- htab->sfpr->size);
- if (htab->params->emit_stub_syms)
- {
- unsigned int i;
-
- for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
- if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
- return FALSE;
- }
- stub_sec->size += htab->sfpr->size;
- }
+ group->stub_sec->size += htab->sfpr->size;
if (htab->relbrlt != NULL)
htab->relbrlt->reloc_count = 0;
@@ -13274,6 +13261,22 @@ ppc64_elf_build_stubs (struct bfd_link_info *info,
}
for (group = htab->group; group != NULL; group = group->next)
+ if (group->needs_save_res)
+ {
+ stub_sec = group->stub_sec;
+ memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
+ htab->sfpr->contents, htab->sfpr->size);
+ if (htab->params->emit_stub_syms)
+ {
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
+ if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
+ return FALSE;
+ }
+ }
+
+ for (group = htab->group; group != NULL; group = group->next)
if ((stub_sec = group->stub_sec) != NULL)
{
stub_sec_count += 1;