diff --git a/pkgs/development/tools/misc/binutils/default.nix b/pkgs/development/tools/misc/binutils/default.nix index 8d759457fa11..ff89f1ad493a 100644 --- a/pkgs/development/tools/misc/binutils/default.nix +++ b/pkgs/development/tools/misc/binutils/default.nix @@ -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" ]; diff --git a/pkgs/development/tools/misc/binutils/mips64-default-n64.patch b/pkgs/development/tools/misc/binutils/mips64-default-n64.patch new file mode 100644 index 000000000000..00581279f85e --- /dev/null +++ b/pkgs/development/tools/misc/binutils/mips64-default-n64.patch @@ -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 + ;;