Subject: [RFC PATCH v2] testing/binutils-cross: new aport

From: Drew DeVault <[email-masked]>
Date: Mon, 13 Jun 2022 11:41:27 +0200

---
 ...gnu.attributes-are-not-checked-for-s.patch |  55 +++++++
 testing/binutils-cross/APKBUILD               | 141 +++++++++++++++++
 .../binutils-ld-fix-static-linking.patch      |  46 ++++++
 .../binutils-mips-disable-assert.patch        |  14 ++
 .../binutils-ppc-fix-machine-options.patch    |  41 +++++
 testing/binutils-cross/binutils-s390x-1.patch | 147 ++++++++++++++++++
 testing/binutils-cross/binutils-s390x-2.patch |  51 ++++++
 testing/binutils-cross/gold-mips.patch        |  39 +++++
 testing/binutils-cross/ld-bfd-mips.patch      |  19 +++
 9 files changed, 553 insertions(+)
 create mode 100644 testing/binutils-cross/0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
 create mode 100644 testing/binutils-cross/APKBUILD
 create mode 100644 testing/binutils-cross/binutils-ld-fix-static-linking.patch
 create mode 100644 testing/binutils-cross/binutils-mips-disable-assert.patch
 create mode 100644 testing/binutils-cross/binutils-ppc-fix-machine-options.patch
 create mode 100644 testing/binutils-cross/binutils-s390x-1.patch
 create mode 100644 testing/binutils-cross/binutils-s390x-2.patch
 create mode 100644 testing/binutils-cross/gold-mips.patch
 create mode 100644 testing/binutils-cross/ld-bfd-mips.patch

diff --git a/testing/binutils-cross/0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch b/testing/binutils-cross/0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
new file mode 100644
index 0000000000..6e1fa7731c
--- /dev/null
+++ b/testing/binutils-cross/0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
@@ -0,0 +1,55 @@
+From bbf05b742fde518fb97c789b043fe0d3aaf549f0 Mon Sep 17 00:00:00 2001
+From: Ariadne Conill <[email-masked]>
+Date: Tue, 21 Sep 2021 14:53:13 +0000
+Subject: [PATCH] Revert "PR25882, .gnu.attributes are not checked for shared
+ libraries"
+
+This revert is needed to avoid wrongly tagging objects with the incompatible
+IBM long double ABI, which is not supported by musl and will result in
+linking errors if used.
+
+This reverts commit a8acd6eeb6dc2cc5460ece90f90ebe36b56b20ba.
+---
+ bfd/elf32-tic6x.c |  3 ---
+ ld/ldlang.c       | 10 ++++------
+ 2 files changed, 4 insertions(+), 9 deletions(-)
+
+diff --git a/bfd/elf32-tic6x.c b/bfd/elf32-tic6x.c
+index 5754f3cb860..3ad1d612749 100644
+--- a/bfd/elf32-tic6x.c
++++ b/bfd/elf32-tic6x.c
+@@ -3735,9 +3735,6 @@ elf32_tic6x_merge_attributes (bfd *ibfd, struct bfd_link_info *info)
+ 
+ 	case Tag_ABI_PIC:
+ 	case Tag_ABI_PID:
+-	  /* Don't transfer these tags from dynamic objects.  */
+-	  if ((ibfd->flags & DYNAMIC) != 0)
+-	    continue;
+ 	  if (out_attr[i].i > in_attr[i].i)
+ 	    out_attr[i].i = in_attr[i].i;
+ 	  break;
+diff --git a/ld/ldlang.c b/ld/ldlang.c
+index 37b64c89ee1..f13beaef9d9 100644
+--- a/ld/ldlang.c
++++ b/ld/ldlang.c
+@@ -7071,13 +7071,11 @@ lang_check (void)
+ 		   bfd_printable_name (input_bfd), input_bfd,
+ 		   bfd_printable_name (link_info.output_bfd));
+ 	}
+-
+-      /* If the input bfd has no contents, it shouldn't set the
+-	 private data of the output bfd.  */
+-      else if (!file->flags.just_syms
+-	       && ((input_bfd->flags & DYNAMIC) != 0
+-		   || bfd_count_sections (input_bfd) != 0))
++      else if (bfd_count_sections (input_bfd))
+ 	{
++	  /* If the input bfd has no contents, it shouldn't set the
++	     private data of the output bfd.  */
++
+ 	  bfd_error_handler_type pfn = NULL;
+ 
+ 	  /* If we aren't supposed to warn about mismatched input
+-- 
+2.33.0
+
diff --git a/testing/binutils-cross/APKBUILD b/testing/binutils-cross/APKBUILD
new file mode 100644
index 0000000000..a9e1223fdf
--- /dev/null
+++ b/testing/binutils-cross/APKBUILD
@@ -0,0 +1,141 @@
+# Contributor: Natanael Copa <[email-masked]>
+# Contributor: Ariadne Conill <[email-masked]>
+# Maintainer: Drew DeVault <[email-masked]>
+pkgname=binutils-cross
+pkgver=2.38
+pkgrel=0
+pkgdesc="Tools necessary to build programs for foreign architectures"
+url="https://www.gnu.org/software/binutils/"
+makedepends_build="bison flex texinfo"
+makedepends_host="zlib-dev"
+makedepends="$makedepends_build $makedepends_host"
+arch="all"
+license="GPL-2.0 GPL-3.0-or-later LGPL-2.0 BSD"
+source="https://ftp.gnu.org/gnu/binutils/binutils-$pkgver.tar.xz
+	binutils-ld-fix-static-linking.patch
+	gold-mips.patch
+	ld-bfd-mips.patch
+	0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
+	binutils-mips-disable-assert.patch
+	binutils-ppc-fix-machine-options.patch
+	binutils-s390x-1.patch
+	binutils-s390x-2.patch
+	"
+builddir="$srcdir/binutils-$pkgver"
+targets="aarch64 armhf armv7 mips64 ppc64le riscv64 s390x x86 x86_64"
+options="!check"
+for target in $targets
+do
+	subpackages="$subpackages binutils-$target:_$target"
+done
+
+build() {
+	for target in $targets
+	do
+		local _arch_configure=""
+		if [ "$target" = "x86_64" ]; then
+			_arch_configure="--enable-targets=x86_64-pep"
+		fi
+
+		case "$target" in
+		mips*)  _hash_style_configure="--enable-default-hash-style=sysv" ;;
+		*)      _hash_style_configure="--enable-default-hash-style=gnu"	;;
+		esac
+
+		mkdir "$srcdir/$target"
+		cd "$srcdir/$target"
+
+		local ctarget="$(arch_to_hostspec "$target")"
+		"$builddir"/configure \
+			--build=$CBUILD \
+			--host=$CHOST \
+			--target=$ctarget \
+			--program-prefix=$ctarget- \
+			--prefix=/usr \
+			--mandir=/usr/share/man \
+			--infodir=/usr/share/info \
+			--disable-multilib \
+			--enable-ld=default \
+			--disable-gold \
+			--enable-64-bit-bfd \
+			--disable-plugins \
+			--enable-relro \
+			--enable-deterministic-archives \
+			--disable-internal-libiberty \
+			$_arch_configure \
+			$_hash_style_configure \
+			--with-pic \
+			--disable-werror \
+			--disable-nls \
+			--with-mmap \
+			--with-system-zlib
+		make
+	done
+}
+
+package() {
+	pkgdesc="Tools necessary to build programs for foreign architectures"
+	for target in $targets
+	do
+		depends="$depends binutils-$target"
+	done
+	mkdir -p "$pkgdir"
+}
+
+_install_target() {
+	local target="$1"
+	pkgdesc="Tools necessary to build programs for $target"
+	cd "$srcdir/$target"
+	make install DESTDIR="$subpkgdir"
+	rm -rf "$subpkgdir"/usr/share
+	rm -rf "$subpkgdir"/usr/lib
+	rm -rf "$subpkgdir"/usr/include
+}
+
+_aarch64() {
+	_install_target aarch64
+}
+
+_armhf() {
+	_install_target armhf
+}
+
+_armv7() {
+	_install_target armv7
+}
+
+_mips64() {
+	_install_target mips64
+}
+
+_ppc64le() {
+	_install_target ppc64le
+}
+
+_riscv64() {
+	_install_target riscv64
+}
+
+_s390x() {
+	_install_target s390x
+}
+
+_x86() {
+	_install_target x86
+}
+
+_x86_64() {
+	_install_target x86_64
+}
+
+sha512sums="
+8bf0b0d193c9c010e0518ee2b2e5a830898af206510992483b427477ed178396cd210235e85fd7bd99a96fc6d5eedbeccbd48317a10f752b7336ada8b2bb826d  binutils-2.38.tar.xz
+ecee33b0e435aa704af1c334e560f201638ff79e199aa11ed78a72f7c9b46f85fbb227af5748e735fd681d1965fcc42ac81b0c8824e540430ce0c706c81e8b49  binutils-ld-fix-static-linking.patch
+f55cf2e0bf82f97583a1abe10710e4013ecf7d64f1da2ef8659a44a06d0dd8beaf58dab98a183488ea137f03e32d62efc878d95f018f836f8cec870bc448556f  gold-mips.patch
+314d2ef9071c89940aa6c8118e8a1e2f191a5d0a4bf596da1ad9cc84f884d8bc7dea8bd7b9fc3f8f1bddd3fd41c6eb017e1e804044b3bf084df1ed9e6e095e2d  ld-bfd-mips.patch
+70ec22bd72ef6dddecfd970613387dd4a8cdc8730dd3cbf03d5a0c3a7c4d839383167bb06dad21bf7c235329fd44b5dc4aefe762f68544f17155cf002bf1be4a  0001-Revert-PR25882-.gnu.attributes-are-not-checked-for-s.patch
+609cd90d8b334eb309f586b17b9d335a08d3dbb6def7c3eb5c010028fcb681674031e5b9d853aa7a39a50304356a86afc184b85562b3f228f8197f4d29395c8f  binutils-mips-disable-assert.patch
+27ea91e0e406e2ed464fd692cf92a07e338781789f2d968c8b95d9d5545985056a6f7f500df3952e5ab42165db28b741aa33d6b717e880b11a2e41fe406b13c4  binutils-ppc-fix-machine-options.patch
+a9efe2689624865f0ff33d4776a5bd295bcad6484bdd38d0ca490fea43691c4933ab33d17478851998eef12922dbf83d6c3225bb1f8faf92a1367d086390f7d3  binutils-s390x-1.patch
+0e291df80ad279005265634014d0935d2c115a5ed708d25407094b7ad4ddf267d1fb7fcbcb2d9ad73bd305b4e3974628b820bd1f249f56c095e4896872434cc9  binutils-s390x-2.patch
+"
diff --git a/testing/binutils-cross/binutils-ld-fix-static-linking.patch b/testing/binutils-cross/binutils-ld-fix-static-linking.patch
new file mode 100644
index 0000000000..bc5d762656
--- /dev/null
+++ b/testing/binutils-cross/binutils-ld-fix-static-linking.patch
@@ -0,0 +1,46 @@
+This fixes static linking for our hardened toolchain
+diff --git a/ld/scripttempl/elf.sc b/ld/scripttempl/elf.sc
+index e8126cb..9532bfb 100644
+--- a/ld/scripttempl/elf.sc
++++ b/ld/scripttempl/elf.sc
+@@ -235,8 +235,8 @@ test "${LARGE_SECTIONS}" = "yes" && LARGE_SECTIONS="
+ if test "${ENABLE_INITFINI_ARRAY}" = "yes"; then
+   SORT_INIT_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))"
+   SORT_FINI_ARRAY="KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))"
+-  CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors"
+-  DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors"
++  CTORS_IN_INIT_ARRAY="EXCLUDE_FILE (*crtbegin*.o *crtend*.o $OTHER_EXCLUDE_FILES) .ctors"
++  DTORS_IN_FINI_ARRAY="EXCLUDE_FILE (*crtbegin*.o *crtend*.o $OTHER_EXCLUDE_FILES) .dtors"
+ else
+   SORT_INIT_ARRAY="KEEP (*(SORT(.init_array.*)))"
+   SORT_FINI_ARRAY="KEEP (*(SORT(.fini_array.*)))"
+@@ -270,15 +270,14 @@ CTOR=".ctors        ${CONSTRUCTING-0} :
+        doesn't matter which directory crtbegin.o
+        is in.  */
+ 
+-    KEEP (*crtbegin.o(.ctors))
+-    KEEP (*crtbegin?.o(.ctors))
++    KEEP (*crtbegin*.o(.ctors))
+ 
+     /* We don't want to include the .ctor section from
+        the crtend.o file until after the sorted ctors.
+        The .ctor section from the crtend file contains the
+        end of ctors marker and it must be last */
+ 
+-    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .ctors))
++    KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .ctors))
+     KEEP (*(SORT(.ctors.*)))
+     KEEP (*(.ctors))
+     ${CONSTRUCTING+${CTOR_END}}
+@@ -286,9 +285,8 @@ CTOR=".ctors        ${CONSTRUCTING-0} :
+ DTOR=".dtors        ${CONSTRUCTING-0} :
+   {
+     ${CONSTRUCTING+${DTOR_START}}
+-    KEEP (*crtbegin.o(.dtors))
+-    KEEP (*crtbegin?.o(.dtors))
+-    KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o $OTHER_EXCLUDE_FILES) .dtors))
++    KEEP (*crtbegin*.o(.dtors))
++    KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .dtors))
+     KEEP (*(SORT(.dtors.*)))
+     KEEP (*(.dtors))
+     ${CONSTRUCTING+${DTOR_END}}
diff --git a/testing/binutils-cross/binutils-mips-disable-assert.patch b/testing/binutils-cross/binutils-mips-disable-assert.patch
new file mode 100644
index 0000000000..1a78858033
--- /dev/null
+++ b/testing/binutils-cross/binutils-mips-disable-assert.patch
@@ -0,0 +1,14 @@
+diff -urN binutils-2.35.2.orig/bfd/elfxx-mips.c binutils-2.35.2/bfd/elfxx-mips.c
+--- binutils-2.35.2.orig/bfd/elfxx-mips.c	2021-01-30 01:38:03.000000000 -0700
++++ binutils-2.35.2/bfd/elfxx-mips.c	2021-05-13 17:35:34.706913601 -0600
+@@ -6744,8 +6744,10 @@
+      in the relocation.  */
+   if (h != NULL && ! SYMBOL_REFERENCES_LOCAL (info, &h->root))
+     {
++#if 0
+       BFD_ASSERT (htab->root.target_os == is_vxworks
+ 		  || h->global_got_area != GGA_NONE);
++#endif
+       indx = h->root.dynindx;
+       if (SGI_COMPAT (output_bfd))
+ 	defined_p = h->root.def_regular;
diff --git a/testing/binutils-cross/binutils-ppc-fix-machine-options.patch b/testing/binutils-cross/binutils-ppc-fix-machine-options.patch
new file mode 100644
index 0000000000..703ecf98a3
--- /dev/null
+++ b/testing/binutils-cross/binutils-ppc-fix-machine-options.patch
@@ -0,0 +1,41 @@
+Fix for DARN opcode error during ppc64le compilation of rng-tools which
+occurs with binutils 2.38 but not with binutils 2.37..
+
+https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=cebc89b9328;hp=9cbed90ee623d75e31994e7943960c997ba565f2
+
+
+diff -aur a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c
+--- a/gas/config/tc-ppc.c
++++ b/gas/config/tc-ppc.c
+@@ -5965,7 +5965,30 @@
+ 	     options do not count as a new machine, instead they add
+ 	     to currently selected opcodes.  */
+ 	  ppc_cpu_t machine_sticky = 0;
+-	  new_cpu = ppc_parse_cpu (ppc_cpu, &machine_sticky, cpu_string);
++	  /* Unfortunately, some versions of gcc emit a .machine
++	     directive very near the start of the compiler's assembly
++	     output file.  This is bad because it overrides user -Wa
++	     cpu selection.  Worse, there are versions of gcc that
++	     emit the *wrong* cpu, not even respecting the -mcpu given
++	     to gcc.  See gcc pr101393.  And to compound the problem,
++	     as of 20220222 gcc doesn't pass the correct cpu option to
++	     gas on the command line.  See gcc pr59828.  Hack around
++	     this by keeping sticky options for an early .machine.  */
++	  asection *sec;
++	  for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
++	    {
++	      segment_info_type *info = seg_info (sec);
++	      /* Are the frags for this section perturbed from their
++	         initial state?  Even .align will count here.  */
++	      if (info != NULL
++	          && (info->frchainP->frch_root != info->frchainP->frch_last
++	              || info->frchainP->frch_root->fr_type != rs_fill
++	              || info->frchainP->frch_root->fr_fix != 0))
++	        break;
++	    }
++	  new_cpu = ppc_parse_cpu (ppc_cpu,
++	                           sec == NULL ? &sticky : &machine_sticky,
++	                           cpu_string);
+ 	  if (new_cpu != 0)
+ 	    ppc_cpu = new_cpu;
+ 	  else
diff --git a/testing/binutils-cross/binutils-s390x-1.patch b/testing/binutils-cross/binutils-s390x-1.patch
new file mode 100644
index 0000000000..fab51a2fad
--- /dev/null
+++ b/testing/binutils-cross/binutils-s390x-1.patch
@@ -0,0 +1,147 @@
+From 82a5bb730a16f8c7962568030268e784b4fb42c8 Mon Sep 17 00:00:00 2001
+From: Stefan Liebler <[email-masked]>
+Date: Thu, 28 Apr 2022 14:29:58 +0200
+Subject: [PATCH] s390: Avoid dynamic TLS relocs in PIE
+
+No dynamic relocs are needed for TLS defined in an executable, the
+TP relative offset is known at link time.
+
+Fixes
+FAIL: Build pr22263-1
+
+bfd/
+	PR ld/22263
+	* elf64-s390.c (elf_s390_tls_transition): Use bfd_link_dll
+	instead of bfd_link_pic for TLS.
+	(elf_s390_check_relocs): Likewise.
+	(allocate_dynrelocs): Likewise.
+	(elf_s390_relocate_section): Likewise.
+
+(cherry picked from commit 26b1426577b5dcb32d149c64cca3e603b81948a9)
+---
+ bfd/elf64-s390.c | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c
+index e780efa7181..00ee386baab 100644
+--- a/bfd/elf64-s390.c
++++ b/bfd/elf64-s390.c
+@@ -774,7 +774,7 @@ elf_s390_tls_transition (struct bfd_link_info *info,
+ 			 int r_type,
+ 			 int is_local)
+ {
+-  if (bfd_link_pic (info))
++  if (bfd_link_dll (info))
+     return r_type;
+ 
+   switch (r_type)
+@@ -1026,7 +1026,7 @@ elf_s390_check_relocs (bfd *abfd,
+ 	case R_390_TLS_GOTIE20:
+ 	case R_390_TLS_GOTIE64:
+ 	case R_390_TLS_IEENT:
+-	  if (bfd_link_pic (info))
++	  if (bfd_link_dll (info))
+ 	    info->flags |= DF_STATIC_TLS;
+ 	  /* Fall through */
+ 
+@@ -1107,7 +1107,7 @@ elf_s390_check_relocs (bfd *abfd,
+ 	  if (r_type == R_390_TLS_LE64 && bfd_link_pie (info))
+ 	    break;
+ 
+-	  if (!bfd_link_pic (info))
++	  if (!bfd_link_dll (info))
+ 	    break;
+ 	  info->flags |= DF_STATIC_TLS;
+ 	  /* Fall through */
+@@ -1571,7 +1571,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h,
+      to R_390_TLS_LE64 requiring no TLS entry. For GOTIE12 and IEENT
+      we can save the dynamic TLS relocation.  */
+   if (h->got.refcount > 0
+-      && !bfd_link_pic (info)
++      && !bfd_link_dll (info)
+       && h->dynindx == -1
+       && elf_s390_hash_entry(h)->tls_type >= GOT_TLS_IE)
+     {
+@@ -2662,7 +2662,7 @@ elf_s390_relocate_section (bfd *output_bfd,
+ 
+ 	  /* Relocations for tls literal pool entries.  */
+ 	case R_390_TLS_IE64:
+-	  if (bfd_link_pic (info))
++	  if (bfd_link_dll (info))
+ 	    {
+ 	      Elf_Internal_Rela outrel;
+ 	      asection *sreloc;
+@@ -2690,7 +2690,7 @@ elf_s390_relocate_section (bfd *output_bfd,
+ 	  else if (h != NULL)
+ 	    {
+ 	      tls_type = elf_s390_hash_entry(h)->tls_type;
+-	      if (!bfd_link_pic (info) && h->dynindx == -1 && tls_type >= GOT_TLS_IE)
++	      if (!bfd_link_dll (info) && h->dynindx == -1 && tls_type >= GOT_TLS_IE)
+ 		r_type = R_390_TLS_LE64;
+ 	    }
+ 	  if (r_type == R_390_TLS_GD64 && tls_type >= GOT_TLS_IE)
+@@ -2801,14 +2801,14 @@ elf_s390_relocate_section (bfd *output_bfd,
+ 	      if (local_got_offsets == NULL)
+ 		abort();
+ 	      off = local_got_offsets[r_symndx];
+-	      if (bfd_link_pic (info))
++	      if (bfd_link_dll (info))
+ 		goto emit_tls_relocs;
+ 	    }
+ 	  else
+ 	    {
+ 	      off = h->got.offset;
+ 	      tls_type = elf_s390_hash_entry(h)->tls_type;
+-	      if (bfd_link_pic (info) || h->dynindx != -1 || tls_type < GOT_TLS_IE)
++	      if (bfd_link_dll (info) || h->dynindx != -1 || tls_type < GOT_TLS_IE)
+ 		goto emit_tls_relocs;
+ 	    }
+ 
+@@ -2825,7 +2825,7 @@ elf_s390_relocate_section (bfd *output_bfd,
+ 	  break;
+ 
+ 	case R_390_TLS_LDM64:
+-	  if (! bfd_link_pic (info))
++	  if (! bfd_link_dll (info))
+ 	    /* The literal pool entry this relocation refers to gets ignored
+ 	       by the optimized code of the local exec model. Do nothing
+ 	       and the value will turn out zero.  */
+@@ -2900,7 +2900,7 @@ elf_s390_relocate_section (bfd *output_bfd,
+ 	  continue;
+ 
+ 	case R_390_TLS_LDO64:
+-	  if (bfd_link_pic (info) || (input_section->flags & SEC_DEBUGGING))
++	  if (bfd_link_dll (info) || (input_section->flags & SEC_DEBUGGING))
+ 	    relocation -= dtpoff_base (info);
+ 	  else
+ 	    /* When converting LDO to LE, we must negate.  */
+@@ -2922,7 +2922,7 @@ elf_s390_relocate_section (bfd *output_bfd,
+ 
+ 	  if (r_type == R_390_TLS_LOAD)
+ 	    {
+-	      if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
++	      if (!bfd_link_dll (info) && (h == NULL || h->dynindx == -1))
+ 		{
+ 		  /* IE->LE transition. Four valid cases:
+ 		     lg %rx,(0,%ry)    -> sllg %rx,%ry,0
+@@ -2972,7 +2972,7 @@ elf_s390_relocate_section (bfd *output_bfd,
+ 		  invalid_tls_insn (input_bfd, input_section, rel);
+ 		  return false;
+ 		}
+-	      if (!bfd_link_pic (info) && (h == NULL || h->dynindx == -1))
++	      if (!bfd_link_dll (info) && (h == NULL || h->dynindx == -1))
+ 		{
+ 		  /* GD->LE transition.
+ 		     brasl %r14,__tls_get_addr@plt -> brcl 0,. */
+@@ -2991,7 +2991,7 @@ elf_s390_relocate_section (bfd *output_bfd,
+ 	    }
+ 	  else if (r_type == R_390_TLS_LDCALL)
+ 	    {
+-	      if (!bfd_link_pic (info))
++	      if (!bfd_link_dll (info))
+ 		{
+ 		  unsigned int insn0, insn1;
+ 
+-- 
+2.27.0
+
diff --git a/testing/binutils-cross/binutils-s390x-2.patch b/testing/binutils-cross/binutils-s390x-2.patch
new file mode 100644
index 0000000000..75d7a931a3
--- /dev/null
+++ b/testing/binutils-cross/binutils-s390x-2.patch
@@ -0,0 +1,51 @@
+From 9a01457e02e7bb594ff9a9ac62a38c909e2e3083 Mon Sep 17 00:00:00 2001
+From: Stefan Liebler <[email-masked]>
+Date: Thu, 28 Apr 2022 14:30:55 +0200
+Subject: [PATCH] s390: Add DT_JMPREL pointing to .rela.[i]plt with static-pie
+
+In static-pie case, there are IRELATIVE-relocs in
+.rela.iplt (htab->irelplt), which will later be grouped
+to .rela.plt.  On s390, the IRELATIVE relocations are
+always located in .rela.iplt - even for non-static case.
+Ensure that DT_JMPREL, DT_PLTRELA, DT_PLTRELASZ is added
+to the dynamic section even if htab->srelplt->size == 0.
+See _bfd_elf_add_dynamic_tags in bfd/elflink.c.
+
+bfd/
+	elf64-s390.c (elf_s390_size_dynamic_sections):
+	Enforce DT_JMPREL via htab->elf.dt_jmprel_required.
+
+(cherry picked from commit d942d8db12adf4c9e5c7d9ed6496a779ece7149e)
+---
+ bfd/elf64-s390.c | 15 ++++++++++++++-
+ 1 file changed, 14 insertions(+), 1 deletion(-)
+
+diff --git a/bfd/elf64-s390.c b/bfd/elf64-s390.c
+index 00ee386baab..0b851f7ac0e 100644
+--- a/bfd/elf64-s390.c
++++ b/bfd/elf64-s390.c
+@@ -1876,7 +1876,20 @@ elf_s390_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
+       else if (startswith (bfd_section_name (s), ".rela"))
+ 	{
+ 	  if (s->size != 0 && s != htab->elf.srelplt)
+-	    relocs = true;
++	    {
++	      relocs = true;
++	      if (s == htab->elf.irelplt)
++		{
++		  /* In static-pie case, there are IRELATIVE-relocs in
++		     .rela.iplt (htab->irelplt), which will later be grouped
++		     to .rela.plt.  On s390, the IRELATIVE relocations are
++		     always located in .rela.iplt - even for non-static case.
++		     Ensure that DT_JMPREL, DT_PLTRELA, DT_PLTRELASZ is added
++		     to the dynamic section even if htab->srelplt->size == 0.
++		     See _bfd_elf_add_dynamic_tags in bfd/elflink.c.  */
++		  htab->elf.dt_jmprel_required = true;
++		}
++	    }
+ 
+ 	  /* We use the reloc_count field as a counter if we need
+ 	     to copy relocs into the output file.  */
+-- 
+2.27.0
+
diff --git a/testing/binutils-cross/gold-mips.patch b/testing/binutils-cross/gold-mips.patch
new file mode 100644
index 0000000000..291a2aae6a
--- /dev/null
+++ b/testing/binutils-cross/gold-mips.patch
@@ -0,0 +1,39 @@
+# DP: Fix gold on mips64 targets.
+
+gold/
+
+2016-08-09  Aurelien Jarno  <[email-masked]>
+
+	* configure.tgt: Add mips64el*-*-*|mips64le*-*-* and mips64*-*-*.
+
+ 
+--- a/gold/configure.tgt
++++ b/gold/configure.tgt
+@@ -153,6 +153,13 @@ aarch64*-*)
+  targ_big_endian=false
+  targ_extra_big_endian=true
+  ;;
++mips*64*el*-*-*|mips*64*le*-*-*)
++ targ_obj=mips
++ targ_machine=EM_MIPS_RS3_LE
++ targ_size=64
++ targ_big_endian=false
++ targ_extra_big_endian=true
++ ;;
+ mips*el*-*-*|mips*le*-*-*)
+  targ_obj=mips
+  targ_machine=EM_MIPS_RS3_LE
+@@ -160,6 +167,13 @@ mips*el*-*-*|mips*le*-*-*)
+  targ_big_endian=false
+  targ_extra_big_endian=true
+  ;;
++mips*64*-*-*)
++ targ_obj=mips
++ targ_machine=EM_MIPS
++ targ_size=64
++ targ_big_endian=true
++ targ_extra_big_endian=false
++ ;;
+ mips*-*-*)
+  targ_obj=mips
+  targ_machine=EM_MIPS
diff --git a/testing/binutils-cross/ld-bfd-mips.patch b/testing/binutils-cross/ld-bfd-mips.patch
new file mode 100644
index 0000000000..2991c88571
--- /dev/null
+++ b/testing/binutils-cross/ld-bfd-mips.patch
@@ -0,0 +1,19 @@
+--- ./ld/configure.tgt.orig
++++ ./ld/configure.tgt
+@@ -541,12 +541,12 @@
+ 			;;
+ mips*-*-windiss)	targ_emul=elf32mipswindiss
+ 			;;
+-mips64*el-*-linux-*)	targ_emul=elf32ltsmipn32
+-			targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
++mips64*el-*-linux-*)	targ_emul=elf64ltsmip
++			targ_extra_emuls="elf32ltsmipn32 elf32btsmipn32 elf32ltsmip elf32btsmip elf64btsmip"
+ 			targ_extra_libpath=$targ_extra_emuls
+ 			;;
+-mips64*-*-linux-*)	targ_emul=elf32btsmipn32
+-			targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
++mips64*-*-linux-*)	targ_emul=elf64btsmip
++			targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip"
+ 			targ_extra_libpath=$targ_extra_emuls
+ 			;;
+ mips*el-*-linux-*)	targ_emul=elf32ltsmip

base-commit: 7b497064eb552ffc32da3dc2fab1acfabf4879a9
prerequisite-patch-id: 755bd398829e789dcf090d9e42d3e53a134dbbb7
prerequisite-patch-id: 592a5ada0ffb1f8b328cdb975ba2e1f1855f7e69
-- 
2.36.1

---

From: Marian Buschsieweke <[email-masked]>
Date: Mon, 13 Jun 2022 15:40:04 -0000

I think it should be possible to merge `community/binutils-cross-embedded` and `testing/binutils-corss`. There are some differences. E.g. the cross compilers really need mutlilib (e.g. any sensible compiler for ARM microcontrollers must support Cortex M0, Cortex M0+, Cortex M3, Cortex M4, Cortex M7, Cortex M23, ... with and without hardware FPU), and the lib dir has to be `/usr/$target/lib` to match expectations. But other than that it looks pretty much compatible to what we have in `community/binutils-cross-embedded`.

-- 
via https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/35306#note_241714

---

From: Oliver Smith <[email-masked]>
Date: Sun, 03 Jul 2022 17:52:21 -0000

Hi Drew, thanks for making this.

Looks like we can probably drop the cross/binutils-aarch64 packages etc. we maintain in postmarketOS and use this, which would be great. I'd wait with that until this is moved from testing to community though.

It has been two weeks since the MR has been merged, do you want to move it to community?

What about possibly merging with binutils-cross-embedded? (not so relevant for me, but I guess it would lower shared maintenance effort and Marian asked above.)

-- 
via https://gitlab.alpinelinux.org/alpine/aports/-/merge_requests/35306#note_244920

---

From: "Drew DeVault" <[email-masked]>
Date: Mon, 04 Jul 2022 09:43:36 +0200

Hi Oliver! I would be open to moving this to community if it had more
testing, and pmOS is in a good position to do some of that testing --
are you able to help out?

I'm also open with merging -embedded, but not sure what exactly needs to
be done there. I only have toolchain expertise for the architectures I'm
familiar with (i386, x86_64, riscv64, and to some extent aarch64).
Perhaps we can jointly maintain the package to get a nice spread of
participants with different expertise?