binutils: apply debian's patch if isMips64n64
Upstream binutils is missing sensible defaults for a few flags (notably linker personality) when cross-compiling to mips64el-*-*abi64. Most of the time this isn't an issue because packages that invoke the linker directly detect the flags from gcc's behavior (for example, libtool does this) and gcc has good code for detecting the right defaults. However some do not; notably nix, itself lacks this. Presumably Debian is working on upstreaming this, and has more clout than we do. I propose we carry their patch in the meantime. The patch is conditioned on stdenv.targetPlatform.isMips64n64 in order to avoid mass-rebuilds. Closes #164835.
This commit is contained in:
parent
1510ef3101
commit
8305aa29c2
@ -13,6 +13,7 @@ in
|
||||
, flex
|
||||
, texinfo
|
||||
, perl
|
||||
, substitute
|
||||
}:
|
||||
|
||||
# configure silently disables ld.gold if it's unsupported,
|
||||
@ -95,7 +96,13 @@ stdenv.mkDerivation {
|
||||
# this comment for more information:
|
||||
# https://gitlab.haskell.org/ghc/ghc/issues/4210#note_78333
|
||||
lib.optional (stdenv.targetPlatform.isAarch32 && stdenv.hostPlatform.system != stdenv.targetPlatform.system) ./R_ARM_COPY.patch
|
||||
++ lib.optional stdenv.targetPlatform.isWindows ./windres-locate-gcc.patch;
|
||||
++ lib.optional stdenv.targetPlatform.isWindows ./windres-locate-gcc.patch
|
||||
++ lib.optional stdenv.targetPlatform.isMips64n64
|
||||
# this patch is from debian:
|
||||
# https://sources.debian.org/data/main/b/binutils/2.38-3/debian/patches/mips64-default-n64.diff
|
||||
(if stdenv.targetPlatform.isMusl
|
||||
then substitute { src = ./mips64-default-n64.patch; replacements = [ "--replace" "gnuabi64" "muslabi64" ]; }
|
||||
else ./mips64-default-n64.patch);
|
||||
|
||||
outputs = [ "out" "info" "man" ];
|
||||
|
||||
|
@ -0,0 +1,82 @@
|
||||
--- a/bfd/config.bfd
|
||||
+++ b/bfd/config.bfd
|
||||
@@ -927,11 +927,21 @@ case "${targ}" in
|
||||
targ_defvec=mips_elf32_be_vec
|
||||
targ_selvecs="mips_elf32_le_vec mips_elf64_be_vec mips_elf64_le_vec mips_ecoff_be_vec mips_ecoff_le_vec"
|
||||
;;
|
||||
- mips64*el-*-linux*)
|
||||
+ mips*64*el-*-linux*-gnuabi64)
|
||||
+ targ_defvec=mips_elf64_trad_le_vec
|
||||
+ targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec"
|
||||
+ want64=true
|
||||
+ ;;
|
||||
+ mips*64*-*-linux*-gnuabi64)
|
||||
+ targ_defvec=mips_elf64_trad_be_vec
|
||||
+ targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_le_vec"
|
||||
+ want64=true
|
||||
+ ;;
|
||||
+ mips*64*el-*-linux*)
|
||||
targ_defvec=mips_elf32_ntrad_le_vec
|
||||
targ_selvecs="mips_elf32_ntrad_be_vec mips_elf32_trad_le_vec mips_elf32_trad_be_vec mips_elf64_trad_le_vec mips_elf64_trad_be_vec"
|
||||
;;
|
||||
- mips64*-*-linux*)
|
||||
+ mips*64*-*-linux*)
|
||||
targ_defvec=mips_elf32_ntrad_be_vec
|
||||
targ_selvecs="mips_elf32_ntrad_le_vec mips_elf32_trad_be_vec mips_elf32_trad_le_vec mips_elf64_trad_be_vec mips_elf64_trad_le_vec"
|
||||
;;
|
||||
--- a/binutils/testsuite/binutils-all/mips/mips-note-2-n32.d
|
||||
+++ b/binutils/testsuite/binutils-all/mips/mips-note-2-n32.d
|
||||
@@ -1,4 +1,5 @@
|
||||
#PROG: objcopy
|
||||
+#as: -n32
|
||||
#readelf: --notes --wide
|
||||
#objcopy: --merge-notes
|
||||
#name: MIPS merge notes section (n32)
|
||||
--- a/gas/configure
|
||||
+++ b/gas/configure
|
||||
@@ -12167,6 +12167,9 @@ _ACEOF
|
||||
esac
|
||||
# Decide which ABI to target by default.
|
||||
case ${target} in
|
||||
+ mips*64*-linux-gnuabi64)
|
||||
+ mips_default_abi=N64_ABI
|
||||
+ ;;
|
||||
mips64*-linux* | mips-sgi-irix6* | mips64*-freebsd* \
|
||||
| mips64*-kfreebsd*-gnu | mips64*-ps2-elf*)
|
||||
mips_default_abi=N32_ABI
|
||||
--- a/gas/configure.ac
|
||||
+++ b/gas/configure.ac
|
||||
@@ -384,6 +384,9 @@ changequote([,])dnl
|
||||
esac
|
||||
# Decide which ABI to target by default.
|
||||
case ${target} in
|
||||
+ mips*64*-linux-gnuabi64)
|
||||
+ mips_default_abi=N64_ABI
|
||||
+ ;;
|
||||
mips64*-linux* | mips-sgi-irix6* | mips64*-freebsd* \
|
||||
| mips64*-kfreebsd*-gnu | mips64*-ps2-elf*)
|
||||
mips_default_abi=N32_ABI
|
||||
--- a/ld/configure.tgt
|
||||
+++ b/ld/configure.tgt
|
||||
@@ -543,11 +543,19 @@ mips*-*-vxworks*) targ_emul=elf32ebmipvx
|
||||
;;
|
||||
mips*-*-windiss) targ_emul=elf32mipswindiss
|
||||
;;
|
||||
-mips64*el-*-linux-*) targ_emul=elf32ltsmipn32
|
||||
+mips*64*el-*-linux-gnuabi64) targ_emul=elf64ltsmip
|
||||
+ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32ltsmip elf32btsmip elf64btsmip"
|
||||
+ targ_extra_libpath=$targ_extra_emuls
|
||||
+ ;;
|
||||
+mips*64*el-*-linux-*) targ_emul=elf32ltsmipn32
|
||||
targ_extra_emuls="elf32btsmipn32 elf32ltsmip elf32btsmip elf64ltsmip elf64btsmip"
|
||||
targ_extra_libpath=$targ_extra_emuls
|
||||
;;
|
||||
-mips64*-*-linux-*) targ_emul=elf32btsmipn32
|
||||
+mips*64*-*-linux-gnuabi64) targ_emul=elf64btsmip
|
||||
+ targ_extra_emuls="elf32btsmipn32 elf32ltsmipn32 elf32btsmip elf32ltsmip elf64ltsmip"
|
||||
+ targ_extra_libpath=$targ_extra_emuls
|
||||
+ ;;
|
||||
+mips*64*-*-linux-*) targ_emul=elf32btsmipn32
|
||||
targ_extra_emuls="elf32ltsmipn32 elf32btsmip elf32ltsmip elf64btsmip elf64ltsmip"
|
||||
targ_extra_libpath=$targ_extra_emuls
|
||||
;;
|
Loading…
Reference in New Issue
Block a user