diff --git a/pkgs/development/tools/misc/binutils/R_ARM_COPY.patch b/pkgs/development/tools/misc/binutils/R_ARM_COPY.patch new file mode 100644 index 00000000000..87480986352 --- /dev/null +++ b/pkgs/development/tools/misc/binutils/R_ARM_COPY.patch @@ -0,0 +1,29 @@ +@@ -, +, @@ +--- + bfd/elf32-arm.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) +--- a/bfd/elf32-arm.c ++++ a/bfd/elf32-arm.c +@@ -15398,7 +15398,11 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info, + linker to copy the initial value out of the dynamic object and into + the runtime process image. We need to remember the offset into the + .rel(a).bss section we are going to use. */ +- if ((h->root.u.def.section->flags & SEC_READONLY) != 0) ++ if (info->nocopyreloc == 0 ++ && (h->root.u.def.section->flags & SEC_ALLOC) != 0 ++ /* PR 16177: A copy is only needed if the input section is readonly. */ ++ && (h->root.u.def.section->flags & SEC_READONLY) != 0 ++ && h->size != 0) + { + s = globals->root.sdynrelro; + srel = globals->root.sreldynrelro; +@@ -15410,6 +15414,8 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info, + } + if (info->nocopyreloc == 0 + && (h->root.u.def.section->flags & SEC_ALLOC) != 0 ++ /* PR 16177: A copy is only needed if the input section is readonly. */ ++ && (h->root.u.def.section->flags & SEC_READONLY) != 0 + && h->size != 0) + { + elf32_arm_allocate_dynrelocs (info, srel, 1); + diff --git a/pkgs/development/tools/misc/binutils/default.nix b/pkgs/development/tools/misc/binutils/default.nix index c0846fce45c..978ec3f2f99 100644 --- a/pkgs/development/tools/misc/binutils/default.nix +++ b/pkgs/development/tools/misc/binutils/default.nix @@ -101,6 +101,14 @@ stdenv.mkDerivation { ./patches/2.31/0001-x86-Properly-add-X86_ISA_1_NEEDED-property.patch ] ++ lib.optional stdenv.targetPlatform.isiOS ./support-ios.patch + ++ # This patch was suggested by Nick Clifton to fix + # https://sourceware.org/bugzilla/show_bug.cgi?id=16177 + # It can be removed when that 7-year-old bug is closed. + # This binutils bug causes GHC to emit broken binaries on armv7, and + # indeed GHC will refuse to compile with a binutils suffering from it. See + # this comment for more information: + # https://gitlab.haskell.org/ghc/ghc/issues/4210#note_78333 + lib.optional stdenv.targetPlatform.isAarch32 ./R_ARM_COPY.patch ; outputs = [ "out" "info" "man" ];