about summary refs log tree commit diff
path: root/pkgs/stdenv
diff options
context:
space:
mode:
authorVladimír Čunát <v@cunat.cz>2021-06-30 19:47:13 +0200
committerVladimír Čunát <v@cunat.cz>2021-07-06 16:02:11 +0200
commit5a71fa84478ae86d2306aba0e9c4d79d1970ecb5 (patch)
tree77f69099d44d40fdc9da6ca78683fad52c10867d /pkgs/stdenv
parente9a1b2009ec9a5713b930d3ab6f4c908ba48498b (diff)
downloadnixlib-5a71fa84478ae86d2306aba0e9c4d79d1970ecb5.tar
nixlib-5a71fa84478ae86d2306aba0e9c4d79d1970ecb5.tar.gz
nixlib-5a71fa84478ae86d2306aba0e9c4d79d1970ecb5.tar.bz2
nixlib-5a71fa84478ae86d2306aba0e9c4d79d1970ecb5.tar.lz
nixlib-5a71fa84478ae86d2306aba0e9c4d79d1970ecb5.tar.xz
nixlib-5a71fa84478ae86d2306aba0e9c4d79d1970ecb5.tar.zst
nixlib-5a71fa84478ae86d2306aba0e9c4d79d1970ecb5.zip
stdenv bootstrap: hack around glibc version mismatch
With this we shouldn't need other workarounds for the LTO problems.
Diffstat (limited to 'pkgs/stdenv')
-rw-r--r--pkgs/stdenv/linux/default.nix19
1 files changed, 19 insertions, 0 deletions
diff --git a/pkgs/stdenv/linux/default.nix b/pkgs/stdenv/linux/default.nix
index 63a37d54547d..1fbd3cba27ef 100644
--- a/pkgs/stdenv/linux/default.nix
+++ b/pkgs/stdenv/linux/default.nix
@@ -258,6 +258,25 @@ in
         # Rewrap the binutils with the new glibc, so both the next
         # stage's wrappers use it.
         libc = getLibc self;
+
+        # Unfortunately, when building gcc in the next stage, its LTO plugin
+        # would use the final libc but `ld` would use the bootstrap one,
+        # and that can fail to load.  Therefore we upgrade `ld` to use newer libc;
+        # apparently the interpreter needs to match libc, too.
+        bintools = self.stdenvNoCC.mkDerivation {
+          inherit (prevStage.bintools.bintools) name;
+          dontUnpack = true;
+          dontBuild = true;
+          # We wouldn't need to *copy* all, but it's easier and the result is temporary anyway.
+          installPhase = ''
+            mkdir -p "$out"/bin
+            cp -a '${prevStage.bintools.bintools}'/bin/* "$out"/bin/
+            chmod +w "$out"/bin/ld.bfd
+            patchelf --set-interpreter '${getLibc self}'/lib/ld*.so.? \
+              --set-rpath "${getLibc self}/lib:$(patchelf --print-rpath "$out"/bin/ld.bfd)" \
+              "$out"/bin/ld.bfd
+          '';
+        };
       };
     };
   })