From: Matthias Klose Date: Sun, 18 Mar 2018 04:51:40 +0000 (+0000) Subject: ppc-e-o-l-functions X-Git-Tag: archive/raspbian/2.30-8+rpi1^2~2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=00a6d9c70ceeacd121a5e617af54dd2ff1a7e235;p=binutils.git ppc-e-o-l-functions # DP: Fix PowerPC64 out-of-line save/restore functions, taken from the trunk bfd/ 2018-03-14 Alan Modra * 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. Gbp-Pq: Name ppc-e-o-l-functions.diff --- diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 6fcdff067..039294fd1 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -6645,7 +6645,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; @@ -13232,20 +13232,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; @@ -13258,6 +13245,22 @@ ppc64_elf_build_stubs (struct bfd_link_info *info, stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align); } + 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) {