diff --git a/cross/binutils-aarch64/APKBUILD b/cross/binutils-aarch64/APKBUILD index 51953220f..a5fb3af46 100644 --- a/cross/binutils-aarch64/APKBUILD +++ b/cross/binutils-aarch64/APKBUILD @@ -5,7 +5,7 @@ pkgname="binutils-aarch64" pkgver=2.30 -pkgrel=1 +pkgrel=2 pkgdesc="Tools necessary to build programs for aarch64 targets" url="https://www.gnu.org/software/binutils/" depends="" @@ -16,6 +16,7 @@ arch="armhf x86_64 x86" license="GPL-2.0 GPL-3.0-or-later LGPL-2.0 BSD" subpackages="" source="http://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.bz2 + fix-powerpc64-out-ot-line-save-restore.patch binutils-ld-fix-static-linking.patch gold-mips.patch " @@ -61,5 +62,6 @@ package() { sha512sums="c3ce91aa20f058ec589bf18c722bf651331b394db6378900cc813cc0eea3a331a96584d5ae090630b627369510397dccc9edfcd43d4aeefc99579f277a05c72c binutils-2.30.tar.bz2 +29791af5a09387d16fc4272dc7a10f71aed5a13187187af533bbe365506d6e6b581030d3f9bb4b7d8e300fb29b8b37b5f48027d86e33a8395b1a6d2dfb2d895a fix-powerpc64-out-ot-line-save-restore.patch ecee33b0e435aa704af1c334e560f201638ff79e199aa11ed78a72f7c9b46f85fbb227af5748e735fd681d1965fcc42ac81b0c8824e540430ce0c706c81e8b49 binutils-ld-fix-static-linking.patch f55cf2e0bf82f97583a1abe10710e4013ecf7d64f1da2ef8659a44a06d0dd8beaf58dab98a183488ea137f03e32d62efc878d95f018f836f8cec870bc448556f gold-mips.patch" diff --git a/cross/binutils-aarch64/fix-powerpc64-out-ot-line-save-restore.patch b/cross/binutils-aarch64/fix-powerpc64-out-ot-line-save-restore.patch new file mode 100644 index 000000000..56ec7ede4 --- /dev/null +++ b/cross/binutils-aarch64/fix-powerpc64-out-ot-line-save-restore.patch @@ -0,0 +1,93 @@ +From d66deb71f1537e2e30dccdfda22eed5d46ec47eb Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Wed, 14 Mar 2018 22:09:33 +1030 +Subject: [PATCH] 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. + +(cherry picked from commit 7dda8d3cf3b089bb7e03c4cdbec827fc6a188c88) +--- + bfd/ChangeLog | 9 +++++++++ + bfd/elf64-ppc.c | 33 ++++++++++++++++++--------------- + 2 files changed, 27 insertions(+), 15 deletions(-) + +diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c +index 6fcdff0..039294f 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; +@@ -13259,6 +13246,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; +-- +2.9.3 + diff --git a/cross/binutils-armhf/APKBUILD b/cross/binutils-armhf/APKBUILD index 3fc5609de..92494c298 100644 --- a/cross/binutils-armhf/APKBUILD +++ b/cross/binutils-armhf/APKBUILD @@ -5,7 +5,7 @@ pkgname="binutils-armhf" pkgver=2.30 -pkgrel=1 +pkgrel=2 pkgdesc="Tools necessary to build programs for armhf targets" url="https://www.gnu.org/software/binutils/" depends="" @@ -16,6 +16,7 @@ arch="aarch64 x86_64 x86" license="GPL-2.0 GPL-3.0-or-later LGPL-2.0 BSD" subpackages="" source="http://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.bz2 + fix-powerpc64-out-ot-line-save-restore.patch binutils-ld-fix-static-linking.patch gold-mips.patch " @@ -61,5 +62,6 @@ package() { sha512sums="c3ce91aa20f058ec589bf18c722bf651331b394db6378900cc813cc0eea3a331a96584d5ae090630b627369510397dccc9edfcd43d4aeefc99579f277a05c72c binutils-2.30.tar.bz2 +29791af5a09387d16fc4272dc7a10f71aed5a13187187af533bbe365506d6e6b581030d3f9bb4b7d8e300fb29b8b37b5f48027d86e33a8395b1a6d2dfb2d895a fix-powerpc64-out-ot-line-save-restore.patch ecee33b0e435aa704af1c334e560f201638ff79e199aa11ed78a72f7c9b46f85fbb227af5748e735fd681d1965fcc42ac81b0c8824e540430ce0c706c81e8b49 binutils-ld-fix-static-linking.patch f55cf2e0bf82f97583a1abe10710e4013ecf7d64f1da2ef8659a44a06d0dd8beaf58dab98a183488ea137f03e32d62efc878d95f018f836f8cec870bc448556f gold-mips.patch" diff --git a/cross/binutils-armhf/fix-powerpc64-out-ot-line-save-restore.patch b/cross/binutils-armhf/fix-powerpc64-out-ot-line-save-restore.patch new file mode 100644 index 000000000..56ec7ede4 --- /dev/null +++ b/cross/binutils-armhf/fix-powerpc64-out-ot-line-save-restore.patch @@ -0,0 +1,93 @@ +From d66deb71f1537e2e30dccdfda22eed5d46ec47eb Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Wed, 14 Mar 2018 22:09:33 +1030 +Subject: [PATCH] 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. + +(cherry picked from commit 7dda8d3cf3b089bb7e03c4cdbec827fc6a188c88) +--- + bfd/ChangeLog | 9 +++++++++ + bfd/elf64-ppc.c | 33 ++++++++++++++++++--------------- + 2 files changed, 27 insertions(+), 15 deletions(-) + +diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c +index 6fcdff0..039294f 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; +@@ -13259,6 +13246,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; +-- +2.9.3 + diff --git a/cross/binutils-x86_64/APKBUILD b/cross/binutils-x86_64/APKBUILD index 0cce4ac56..fd62aa319 100644 --- a/cross/binutils-x86_64/APKBUILD +++ b/cross/binutils-x86_64/APKBUILD @@ -5,7 +5,7 @@ pkgname="binutils-x86_64" pkgver=2.30 -pkgrel=1 +pkgrel=2 pkgdesc="Tools necessary to build programs for x86_64 targets" url="https://www.gnu.org/software/binutils/" depends="" @@ -16,6 +16,7 @@ arch="armhf aarch64 x86" license="GPL-2.0 GPL-3.0-or-later LGPL-2.0 BSD" subpackages="" source="http://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.bz2 + fix-powerpc64-out-ot-line-save-restore.patch binutils-ld-fix-static-linking.patch gold-mips.patch " @@ -61,5 +62,6 @@ package() { sha512sums="c3ce91aa20f058ec589bf18c722bf651331b394db6378900cc813cc0eea3a331a96584d5ae090630b627369510397dccc9edfcd43d4aeefc99579f277a05c72c binutils-2.30.tar.bz2 +29791af5a09387d16fc4272dc7a10f71aed5a13187187af533bbe365506d6e6b581030d3f9bb4b7d8e300fb29b8b37b5f48027d86e33a8395b1a6d2dfb2d895a fix-powerpc64-out-ot-line-save-restore.patch ecee33b0e435aa704af1c334e560f201638ff79e199aa11ed78a72f7c9b46f85fbb227af5748e735fd681d1965fcc42ac81b0c8824e540430ce0c706c81e8b49 binutils-ld-fix-static-linking.patch f55cf2e0bf82f97583a1abe10710e4013ecf7d64f1da2ef8659a44a06d0dd8beaf58dab98a183488ea137f03e32d62efc878d95f018f836f8cec870bc448556f gold-mips.patch" diff --git a/cross/binutils-x86_64/fix-powerpc64-out-ot-line-save-restore.patch b/cross/binutils-x86_64/fix-powerpc64-out-ot-line-save-restore.patch new file mode 100644 index 000000000..56ec7ede4 --- /dev/null +++ b/cross/binutils-x86_64/fix-powerpc64-out-ot-line-save-restore.patch @@ -0,0 +1,93 @@ +From d66deb71f1537e2e30dccdfda22eed5d46ec47eb Mon Sep 17 00:00:00 2001 +From: Alan Modra +Date: Wed, 14 Mar 2018 22:09:33 +1030 +Subject: [PATCH] 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. + +(cherry picked from commit 7dda8d3cf3b089bb7e03c4cdbec827fc6a188c88) +--- + bfd/ChangeLog | 9 +++++++++ + bfd/elf64-ppc.c | 33 ++++++++++++++++++--------------- + 2 files changed, 27 insertions(+), 15 deletions(-) + +diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c +index 6fcdff0..039294f 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; +@@ -13259,6 +13246,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; +-- +2.9.3 +