diff --git a/foundation/flake.lock b/foundation/flake.lock
index 37bbbad..f58668e 100644
--- a/foundation/flake.lock
+++ b/foundation/flake.lock
@@ -3,17 +3,18 @@
     "lib": {
       "locked": {
         "dir": "lib",
-        "dirtyRev": "2be3111b2c0911f40b47fe0a1fb22b5f5188cf59-dirty",
-        "dirtyShortRev": "2be3111-dirty",
-        "lastModified": 1719251485,
-        "narHash": "sha256-63NvfFVeTDITfNu60rmCUlaZtAeZUnvrIaOLSk9ScC8=",
+        "lastModified": 1723737980,
+        "narHash": "sha256-1WnFatW5kSuO2jjt62hvSbH84TSYyO+VmvkJ0d5e/ZY=",
+        "ref": "master",
+        "rev": "cadfaabc853d20f2bc20bad794fcbe520ea48f13",
+        "revCount": 82,
         "type": "git",
-        "url": "file:../?dir=lib"
+        "url": "file:../"
       },
       "original": {
         "dir": "lib",
         "type": "git",
-        "url": "file:../?dir=lib"
+        "url": "file:../"
       }
     },
     "root": {
diff --git a/tidepool/flake.lock b/tidepool/flake.lock
index 990a516..746a587 100644
--- a/tidepool/flake.lock
+++ b/tidepool/flake.lock
@@ -8,33 +8,35 @@
       },
       "locked": {
         "dir": "foundation",
-        "dirtyRev": "3f9d287065ac685ce500c2cddb35428b2927f5a2-dirty",
-        "dirtyShortRev": "3f9d287-dirty",
-        "lastModified": 1720514984,
-        "narHash": "sha256-AuixwSlYk34Z6+GEc7y4QotF3Hk963zC9I9hAwX5KCE=",
+        "lastModified": 1724190751,
+        "narHash": "sha256-e8sOmeXS9YWuQqjW6gvtS3PIueazkf4S1iiJ/94eXv4=",
+        "ref": "master",
+        "rev": "4b36a5a0133f5481840bdfaf693c971215a7ef1f",
+        "revCount": 84,
         "type": "git",
-        "url": "file:../?dir=foundation"
+        "url": "file:../"
       },
       "original": {
         "dir": "foundation",
         "type": "git",
-        "url": "file:../?dir=foundation"
+        "url": "file:../"
       }
     },
     "lib": {
       "locked": {
         "dir": "lib",
-        "dirtyRev": "3f9d287065ac685ce500c2cddb35428b2927f5a2-dirty",
-        "dirtyShortRev": "3f9d287-dirty",
-        "lastModified": 1720514984,
-        "narHash": "sha256-AuixwSlYk34Z6+GEc7y4QotF3Hk963zC9I9hAwX5KCE=",
+        "lastModified": 1724190751,
+        "narHash": "sha256-e8sOmeXS9YWuQqjW6gvtS3PIueazkf4S1iiJ/94eXv4=",
+        "ref": "master",
+        "rev": "4b36a5a0133f5481840bdfaf693c971215a7ef1f",
+        "revCount": 84,
         "type": "git",
-        "url": "file:../?dir=lib"
+        "url": "file:../"
       },
       "original": {
         "dir": "lib",
         "type": "git",
-        "url": "file:../?dir=lib"
+        "url": "file:../"
       }
     },
     "root": {
diff --git a/tidepool/src/builders/basic.nix b/tidepool/src/builders/basic.nix
index e7badef..f2e01d2 100644
--- a/tidepool/src/builders/basic.nix
+++ b/tidepool/src/builders/basic.nix
@@ -65,7 +65,15 @@ in
               PATH =
                 let
                   bins = lib.paths.bin (
-                    (lib.packages.dependencies.get dependencies.build.host)
+                    (lib.packages.dependencies.get dependencies.build.only)
+                    ++ (lib.packages.dependencies.get dependencies.build.build)
+                    ++ (lib.packages.dependencies.get dependencies.build.host)
+                    ++ (lib.packages.dependencies.get dependencies.build.target)
+                    ++ (lib.packages.dependencies.get dependencies.host.only)
+                    ++ (lib.packages.dependencies.get dependencies.host.host)
+                    ++ (lib.packages.dependencies.get dependencies.host.target)
+                    ++ (lib.packages.dependencies.get dependencies.target.only)
+                    ++ (lib.packages.dependencies.get dependencies.target.target)
                     ++ [
                       foundation.stage2-bash
                       foundation.stage2-coreutils
@@ -99,6 +107,7 @@ in
             }
           );
         in
+        # (builtins.trace "build: ${package.name} -> build=${package.platform.build.triple} host=${package.platform.host.triple} target=${package.platform.target.triple}")
         built
         // {
           inherit (package) meta;
diff --git a/tidepool/src/export.nix b/tidepool/src/export.nix
index 8eb98c3..58d672f 100644
--- a/tidepool/src/export.nix
+++ b/tidepool/src/export.nix
@@ -16,27 +16,24 @@ in
         aux-a = config.packages.aux.a;
         aux-b = config.packages.aux.b;
 
-        # foundation-gcc-x86_64 =
-        # (config.packages.foundation.gcc.versions."13.2.0".extend (args: {
-        #   config = {
-        #     platform = {
-        #       target = lib.modules.overrides.force "x86_64-linux";
-        #     };
-        #   };
-        # }))
-        # .config;
         foundation-gcc = config.packages.foundation.gcc;
+        foundation-glibc = config.packages.foundation.glibc;
         foundation-binutils = config.packages.foundation.binutils;
         foundation-linux-headers = config.packages.foundation.linux-headers;
-        # foundation-linux-headers = config.packages.foundation.linux-headers.versions.latest.extend {
-        #   platform.host = lib.modules.overrides.force "x86_64-linux";
-        # };
-        # example-x = config.packages.example.x;
-        cross-aux-a-x86_64-linux = config.packages.cross.x86_64-linux.aux.a;
-        cross-foundation-gcc-x86_64-linux = config.packages.cross.x86_64-linux.foundation.gcc;
+
+        cross-foundation-glibc-x86_64-linux = config.packages.cross.x86_64-linux.foundation.glibc;
+        cross-foundation-binutils-x86_64-linux = config.packages.cross.x86_64-linux.foundation.binutils;
+
+        cross-tool-foundation-gcc-newlib-x86_64-linux = config.packages.cross-tools.x86_64-linux.foundation.gcc-newlib;
+        cross-tool-foundation-gcc-x86_64-linux = config.packages.cross-tools.x86_64-linux.foundation.gcc-cross;
+        cross-foundation-gcc-x86_64-linux = config.packages.cross.x86_64-linux.foundation.gcc-bootstrap;
+
+        example-a = config.packages.foundation.gcc.versions.latest.extend {
+          platform = {
+            target = lib.modules.override 0 "x86_64-linux";
+          };
+        };
       };
     };
-
-    # exported.packages.i686-linux.cross-foundation-gcc-x86_64-linux = config.packages.cross.x86_64-linux.foundation.gcc.package;
   };
 }
diff --git a/tidepool/src/lib/types.nix b/tidepool/src/lib/types.nix
index d4723b1..16caad9 100644
--- a/tidepool/src/lib/types.nix
+++ b/tidepool/src/lib/types.nix
@@ -230,6 +230,34 @@ in
                   default.value = [ ];
                 };
 
+                # extend = lib.options.create {
+                #   description = "Extend the package definition.";
+                #   type = lib.types.function lib.types.raw;
+                #   internal = true;
+                #   writable = false;
+                #   default.value = module:
+                #     let
+                #       normalized =
+                #         if builtins.isList module then
+                #           module
+                #         else if builtins.isFunction module || module ? config then
+                #           [ module ]
+                #         else
+                #           [{
+                #             config = module;
+                #           }];
+                #       result = meta.extend {
+                #         modules =
+                #           normalized ++ [
+                #             {
+                #               config.__modules__ = lib.modules.overrides.force (config.__modules__ ++ normalized);
+                #             }
+                #           ];
+                #       };
+                #     in
+                #     result.config;
+                # };
+
                 extend = lib.options.create {
                   description = "Extend the package definition.";
                   type = lib.types.function lib.types.raw;
@@ -246,13 +274,14 @@ in
                           [{
                             config = module;
                           }];
-                      result = meta.extend {
-                        modules =
-                          normalized ++ [
-                            {
-                              config.__modules__ = lib.modules.overrides.force (config.__modules__ ++ normalized);
-                            }
-                          ];
+
+											modules = config.__modules__ ++ normalized;
+
+                      result = lib.modules.run {
+                        modules = [
+													submodule
+													{ config.__modules__ = modules; }
+												] ++ modules;
                       };
                     in
                     result.config;
@@ -261,8 +290,8 @@ in
                 meta = {
                   description = lib.options.create {
                     description = "The description for the package.";
-                    type = lib.types.nullish lib.types.string;
-                    default.value = null;
+                    type = lib.types.string;
+                    default.value = "";
                   };
 
                   homepage = lib.options.create {
diff --git a/tidepool/src/packages/aux/a.nix b/tidepool/src/packages/aux/a.nix
index 3848de8..7efef9b 100644
--- a/tidepool/src/packages/aux/a.nix
+++ b/tidepool/src/packages/aux/a.nix
@@ -1,4 +1,4 @@
-{ lib', config }:
+{ config }:
 let
   inherit (config) builders packages;
 in
diff --git a/tidepool/src/packages/default.nix b/tidepool/src/packages/default.nix
index 1807094..03a210c 100644
--- a/tidepool/src/packages/default.nix
+++ b/tidepool/src/packages/default.nix
@@ -4,7 +4,7 @@ let
 
   doubles = lib.systems.doubles.all;
 
-  packages = builtins.removeAttrs config.packages [ "cross" ];
+  packages = builtins.removeAttrs config.packages [ "cross" "cross-tools" ];
 in
 {
   includes = [
@@ -21,6 +21,14 @@ in
         freeform = lib.types.packages;
 
         options = {
+          cross-tools = lib.attrs.generate doubles (
+            system:
+            lib.options.create {
+              description = "The cross-compilation tools for the ${system} target.";
+              type = lib.types.packages;
+              default.value = { };
+            }
+          );
           cross = lib.attrs.generate doubles (
             system:
             lib.options.create {
@@ -54,6 +62,36 @@ in
   };
 
   config = {
+    packages.cross-tools = lib.attrs.generate doubles (
+      system:
+      builtins.mapAttrs
+        (
+          namespace:
+          builtins.mapAttrs (
+            name: alias:
+              let
+                setTarget =
+                  package:
+                  package
+                  // {
+                    __modules__ = package.__modules__ ++ [
+                      {
+                        config.platform = {
+                          target = lib.modules.override 5 system;
+                        };
+                      }
+                    ];
+                  };
+
+                updated = alias // {
+                  versions = builtins.mapAttrs (version: package: setTarget package) alias.versions;
+                };
+              in
+              updated
+          )
+        )
+        packages
+    );
     packages.cross = lib.attrs.generate doubles (
       system:
       builtins.mapAttrs
@@ -62,7 +100,7 @@ in
           builtins.mapAttrs (
             name: alias:
               let
-                setHost =
+                setPlatform =
                   package:
                   package
                   // {
@@ -77,7 +115,7 @@ in
                   };
 
                 updated = alias // {
-                  versions = builtins.mapAttrs (version: package: setHost package) alias.versions;
+                  versions = builtins.mapAttrs (version: package: setPlatform package) alias.versions;
                 };
               in
               updated
diff --git a/tidepool/src/packages/foundation/binutils/default.nix b/tidepool/src/packages/foundation/binutils/default.nix
index 77c4bdd..caa2879 100644
--- a/tidepool/src/packages/foundation/binutils/default.nix
+++ b/tidepool/src/packages/foundation/binutils/default.nix
@@ -1,8 +1,8 @@
-{
-  lib,
-  lib',
-  config,
-  options,
+{ lib
+, lib'
+, config
+, options
+,
 }:
 let
   inherit (config)
@@ -27,101 +27,149 @@ in
             };
           };
 
-          config = {
-            meta = {
-              platforms = [ "i686-linux" ];
-            };
+          config =
+            let
+              isBuildBootstrapped = config.platform.build.double == "i686-linux";
+              isHostBootstrapped = config.platform.host.double == "i686-linux";
 
-            pname = "binutils";
-            version = "2.41";
+              isBootstrapped = isBuildBootstrapped && isHostBootstrapped;
 
-            builder = builders.basic;
+              isCross =
+                config.platform.build.double != config.platform.host.double
+                && config.platform.host.double == config.platform.target.double;
+            in
+            {
+              meta = {
+                platforms = [
+                  "i686-linux"
+                  "x86_64-linux"
+                ];
+              };
 
-            deps = {
-              build = {
-                host = {
-                  inherit (packages.foundation) gcc;
+              pname = "binutils";
+              version = "2.41";
+
+              builder = builders.basic;
+
+              deps = {
+                build = {
+                  only = {
+                    gcc = lib.modules.when (!isBootstrapped) (
+                      if isCross then
+                        packages.foundation.gcc-cross.versions.latest.extend
+                          {
+                            platform = lib.modules.override 0 {
+                              inherit (config.platform) build target;
+                              host = config.platform.build;
+                            };
+                          }
+                      else
+                        packages.foundation.gcc.versions.latest
+                    );
+                    glibc = lib.modules.when (isCross) (
+                      packages.foundation.glibc.versions.latest.extend {
+                        platform = lib.modules.override 0 {
+                          inherit (config.platform) host target build;
+                        };
+                      }
+                    );
+                    binutils = lib.modules.when (isCross) (
+                      packages.foundation.binutils.versions.latest.extend {
+                        platform = lib.modules.override 0 {
+                          inherit (config.platform) target build;
+                          host = config.platform.build;
+                        };
+                      }
+                    );
+                  };
                 };
               };
-            };
 
-            env = {
-              PATH = lib.paths.bin [
-                # foundation.stage2-gcc
-                foundation.stage2-binutils
-                foundation.stage2-gnumake
-                foundation.stage2-gnupatch
-                foundation.stage2-gnused
-                foundation.stage2-gnugrep
-                foundation.stage2-gawk
-                foundation.stage2-diffutils
-                foundation.stage2-findutils
-                foundation.stage2-gnutar
-                foundation.stage1-xz
-              ];
-            };
+              env = {
+                PATH = lib.paths.bin (
+                  lib.lists.when (isBootstrapped) [ foundation.stage2-gcc ]
+                    ++ [
+                    foundation.stage2-gcc
+                    foundation.stage2-binutils
+                    foundation.stage2-gnumake
+                    foundation.stage2-gnupatch
+                    foundation.stage2-gnused
+                    foundation.stage2-gnugrep
+                    foundation.stage2-gawk
+                    foundation.stage2-diffutils
+                    foundation.stage2-findutils
+                    foundation.stage2-gnutar
+                    foundation.stage1-xz
+                  ]
+                );
+              } // (lib.attrs.when (isCross) {
+                LDFLAGS_FOR_TARGET = "-B${config.deps.build.only.glibc.package}/lib -L${config.deps.build.only.glibc.package}/lib -I${config.deps.build.only.glibc.package}/include";
+              });
 
-            phases =
-              let
-                patches = [
-                  # Make binutils output deterministic by default.
-                  ./patches/deterministic.patch
-                ];
+              phases =
+                let
+                  patches = [
+                    # Make binutils output deterministic by default.
+                    ./patches/deterministic.patch
+                  ];
 
-                configureFlags = [
-                  # "CC=musl-gcc"
-                  "LDFLAGS=--static"
-                  "--prefix=${builtins.placeholder "out"}"
-                  "--build=${config.platform.build.triple}"
-                  "--host=${config.platform.host.triple}"
-                  "--target=${config.platform.target.triple}"
+                  configureFlags =
+                    lib.lists.when (!isCross) [
+                      "LDFLAGS=--static"
+                    ]
+                    ++ [
+                      "--prefix=${builtins.placeholder "out"}"
+                      "--build=${config.platform.build.triple}"
+                      "--host=${config.platform.host.triple}"
+                      "--target=${config.platform.target.triple}"
 
-                  "--with-sysroot=/"
-                  "--enable-deterministic-archives"
-                  # depends on bison
-                  "--disable-gprofng"
+                      "--with-sysroot=/"
+                      "--enable-deterministic-archives"
+                      # depends on bison
+                      "--disable-gprofng"
 
-                  # Turn on --enable-new-dtags by default to make the linker set
-                  # RUNPATH instead of RPATH on binaries.  This is important because
-                  # RUNPATH can be overridden using LD_LIBRARY_PATH at runtime.
-                  "--enable-new-dtags"
+                      # Turn on --enable-new-dtags by default to make the linker set
+                      # RUNPATH instead of RPATH on binaries.  This is important because
+                      # RUNPATH can be overridden using LD_LIBRARY_PATH at runtime.
+                      "--enable-new-dtags"
 
-                  # By default binutils searches $libdir for libraries. This brings in
-                  # libbfd and libopcodes into a default visibility. Drop default lib
-                  # path to force users to declare their use of these libraries.
-                  "--with-lib-path=:"
+                      # By default binutils searches $libdir for libraries. This brings in
+                      # libbfd and libopcodes into a default visibility. Drop default lib
+                      # path to force users to declare their use of these libraries.
+                      "--with-lib-path=:"
 
-                  "--disable-multilib"
-                ];
-              in
-              {
-                unpack = ''
-                  tar xf ${config.src}
-                  cd binutils-${config.version}
-                '';
+                      "--disable-multilib"
 
-                patch = ''
-                  ${lib.strings.concatMapSep "\n" (file: "patch -Np1 -i ${file}") patches}
-                '';
+                    ];
+                in
+                {
+                  unpack = ''
+                    tar xf ${config.src}
+                    cd binutils-${config.version}
+                  '';
 
-                configure = ''
-                  bash ./configure ${builtins.concatStringsSep " " configureFlags}
-                '';
+                  patch = ''
+                    ${lib.strings.concatMapSep "\n" (file: "patch -Np1 -i ${file}") patches}
+                  '';
 
-                build = ''
-                  make -j $NIX_BUILD_CORES
-                '';
+                  configure = ''
+                    bash ./configure ${builtins.concatStringsSep " " configureFlags}
+                  '';
 
-                install = ''
-                  make -j $NIX_BUILD_CORES install-strip
-                '';
+                  build = ''
+                    make -j $NIX_BUILD_CORES
+                  '';
+
+                  install = ''
+                    make -j $NIX_BUILD_CORES install-strip
+                  '';
+                };
+
+              src = builtins.fetchurl {
+                url = "${mirrors.gnu}/binutils/binutils-${config.version}.tar.xz";
+                sha256 = "rppXieI0WeWWBuZxRyPy0//DHAMXQZHvDQFb3wYAdFA=";
               };
-
-            src = builtins.fetchurl {
-              url = "${mirrors.gnu}/binutils/binutils-${config.version}.tar.xz";
-              sha256 = "rppXieI0WeWWBuZxRyPy0//DHAMXQZHvDQFb3wYAdFA=";
             };
-          };
         };
     };
   };
diff --git a/tidepool/src/packages/foundation/gcc/bootstrap.nix b/tidepool/src/packages/foundation/gcc/bootstrap.nix
new file mode 100644
index 0000000..399be1a
--- /dev/null
+++ b/tidepool/src/packages/foundation/gcc/bootstrap.nix
@@ -0,0 +1,84 @@
+{ config, options }:
+let
+  inherit (config)
+    lib
+    packages
+    ;
+in
+{
+  config.packages.foundation.gcc-bootstrap = {
+    versions = {
+      "latest" = config.packages.foundation.gcc.versions.latest.extend
+        (
+          { config }:
+          {
+            config = {
+              meta = {
+                platforms = lib.modules.override 0 [
+                  "i686-linux"
+                ];
+              };
+
+              deps = {
+                build = {
+                  build = {
+                    gcc = lib.modules.override 0 (
+                      packages.foundation.gcc-cross.versions.latest.extend {
+                        platform = lib.modules.override 0 {
+                          build = "i686-linux";
+                          target = config.platform.target;
+                          host = "i686-linux";
+                        };
+                      }
+                    );
+                    binutils = lib.modules.override 0 (
+                      packages.foundation.binutils.versions.latest.extend {
+                        platform = lib.modules.override 0 {
+                          build = "i686-linux";
+                          target = config.platform.target;
+                          host = config.platform.host;
+                        };
+                      }
+                    );
+                    glibc = lib.modules.override 0 (
+                      packages.foundation.glibc.versions.latest.extend {
+                        platform = lib.modules.override 0 {
+                          build = "i686-linux";
+                          target = config.platform.target;
+                          host = config.platform.host;
+                        };
+                      }
+                    );
+                  };
+                };
+              };
+
+              env = {
+                LIBRARY_PATH = lib.modules.override 0 "${config.deps.build.build.glibc.package}/lib";
+                LDFLAGS_FOR_TARGET =
+                  lib.modules.override 0
+                    "-L$(pwd)/${config.platform.target.triple}/libgcc -L${config.deps.build.build.glibc.package}/lib";
+              };
+
+              configureFlags = lib.modules.override 0 [
+                "--prefix=${builtins.placeholder "out"}"
+                # Pretend we're native even though we're not
+                "--build=${config.platform.target.triple}"
+                "--host=${config.platform.host.triple}"
+                "--target=${config.platform.target.triple}"
+                "--with-as=${config.deps.build.build.binutils.package}/bin/as"
+                "--with-ld=${config.deps.build.build.binutils.package}/bin/ld"
+                "--enable-languages=c,c++"
+                "--disable-bootstrap"
+                "--disable-libsanitizer"
+                "--disable-multilib"
+                "--with-native-system-header-dir=${config.deps.build.build.glibc.package}/include"
+                "--with-gxx-include-dir=${placeholder "out"}/include/c++/${config.version}/"
+                "--with-build-sysroot=/"
+              ];
+            };
+          }
+        );
+    };
+  };
+}
diff --git a/tidepool/src/packages/foundation/gcc/cross.nix b/tidepool/src/packages/foundation/gcc/cross.nix
new file mode 100644
index 0000000..638113c
--- /dev/null
+++ b/tidepool/src/packages/foundation/gcc/cross.nix
@@ -0,0 +1,104 @@
+{ config, options }:
+let
+  inherit (config)
+    lib
+    foundation
+    packages
+    ;
+in
+{
+  config.packages.foundation.gcc-cross = {
+    versions = {
+      "latest" = config.packages.foundation.gcc.versions.latest.extend
+        (
+          { config }:
+          {
+            config =
+              let
+                programPrefix = lib.strings.when
+                  (
+                    config.platform.build.triple != config.platform.target.triple
+                  ) "${config.platform.target.triple}-";
+              in
+              {
+                meta = {
+                  platforms = lib.modules.override 0 [
+                    "i686-linux"
+                  ];
+                };
+
+                deps = {
+                  build = {
+                    build = {
+                      binutils = (
+                        packages.foundation.binutils.versions.latest.extend {
+                          platform = lib.modules.override 0 config.platform;
+                        }
+                      );
+                      glibc = (
+                        packages.foundation.glibc.versions.latest.extend {
+                          platform = lib.modules.override 0 {
+                            inherit (config.platform) build target;
+                            host = config.platform.target;
+                          };
+                        }
+                      );
+                      linux-headers = (
+                        packages.foundation.linux-headers.versions.latest.extend {
+                          platform.target = lib.modules.override 0 config.platform.target;
+                        }
+                      );
+                    };
+                  };
+                };
+
+                env = {
+                  # LIBRARY_PATH = lib.modules.override 0 "${foundation.stage1-musl}/lib";
+                  CC = lib.modules.override 0 "gcc -Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so -idirafter ${foundation.stage1-musl}/include";
+                  CXX = lib.modules.override 0 "g++ -Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so -idirafter ${foundation.stage1-musl}/include";
+                  CFLAGS_FOR_TARGET =
+                    lib.modules.override 0
+                      "-Wl,-dynamic-linker -Wl,${config.deps.build.build.glibc.package}/lib/ld-linux-x86-64.so.2 -B${config.deps.build.build.glibc.package}/lib";
+                  LDFLAGS_FOR_TARGET =
+                    lib.modules.override 0
+                      "-L$(pwd)/${config.platform.target.triple}/libgcc -L${config.deps.build.build.glibc.package}/lib";
+                };
+
+                configureFlags = lib.modules.override 0 [
+                  "--prefix=${builtins.placeholder "out"}"
+                  "--build=${config.platform.build.triple}"
+                  "--host=${config.platform.host.triple}"
+                  "--target=${config.platform.target.triple}"
+                  "--with-as=${config.deps.build.build.binutils.package}/bin/${programPrefix}as"
+                  "--with-ld=${config.deps.build.build.binutils.package}/bin/${programPrefix}ld"
+                  "--enable-languages=c,c++"
+                  "--disable-libsanitizer"
+                  "--disable-lto"
+                  "--disable-multilib"
+                  "--with-headers=${config.deps.build.build.glibc.package}/include"
+                  "--with-build-sysroot=/"
+                  # "--with-sysroot=${config.deps.build.build.glibc.package}"
+                  "--with-native-system-header-dir=${config.deps.build.build.glibc.package}/include"
+                ];
+
+                phases.configure = lib.modules.override 0 ''
+                  # Configure
+
+                  mkdir build
+                  cd build
+                  echo PATH=$PATH
+
+                  # TODO(vlinkz) Hack to fix missing crti.o and crtn.o. Figure out how to properly find their paths.
+                  mkdir gcc
+                  ln -sv ${config.deps.build.build.glibc.package}/lib/{crti.o,crtn.o} gcc
+                  mkdir -p x86_64-unknown-linux-gnu/libstdc++-v3/src
+                  ln -sv ${config.deps.build.build.glibc.package}/lib/{crti.o,crtn.o} x86_64-unknown-linux-gnu/libstdc++-v3/src
+
+                  bash ../configure ${builtins.concatStringsSep " " config.configureFlags}
+                '';
+              };
+          }
+        );
+    };
+  };
+}
diff --git a/tidepool/src/packages/foundation/gcc/default.nix b/tidepool/src/packages/foundation/gcc/default.nix
index 44df14e..b75bcb4 100644
--- a/tidepool/src/packages/foundation/gcc/default.nix
+++ b/tidepool/src/packages/foundation/gcc/default.nix
@@ -11,12 +11,11 @@ let
     ;
 in
 {
-  config.packages.context.options = {
-    "foundation:cflags" = lib.options.create {
-      type = lib.types.list.of lib.types.string;
-      default.value = [ ];
-    };
-  };
+  includes = [
+    ./newlib.nix
+    ./cross.nix
+    ./bootstrap.nix
+  ];
 
   config.packages.foundation.gcc = {
     versions = {
@@ -82,135 +81,239 @@ in
                 description = "Version of isl.";
               };
             };
-          };
 
-          config = {
-            meta = {
-              platforms = [ "i686-linux" ];
+            configureFlags = lib.options.create {
+              type = lib.types.list.of lib.types.string;
+              description = "Flags to pass to the configure script.";
             };
 
-            pname = "gcc";
-            version = "13.2.0";
-
-            builder = builders.basic;
-
-            env = {
-              PATH = lib.paths.bin [
-                foundation.stage2-gcc
-                foundation.stage2-binutils
-                foundation.stage2-gnumake
-                foundation.stage2-gnused
-                foundation.stage2-gnugrep
-                foundation.stage2-gawk
-                foundation.stage2-diffutils
-                foundation.stage2-findutils
-                foundation.stage2-gnutar
-                foundation.stage2-gzip
-                foundation.stage2-bzip2
-                foundation.stage1-xz
-              ];
-            };
-
-            phases =
-              let
-                host = lib.systems.withBuildInfo config.platform.host;
-
-                mbits = if host.system.cpu.family == "x86" then if host.is64bit then "-m64" else "-m32" else "";
-              in
-              {
-                unpack = ''
-                  # Unpack
-                  tar xf ${config.src}
-                  tar xf ${config.gmp.src}
-                  tar xf ${config.mpfr.src}
-                  tar xf ${config.mpc.src}
-                  tar xf ${config.isl.src}
-                  cd gcc-${config.version}
-
-                  ln -s ../gmp-${config.gmp.version} gmp
-                  ln -s ../mpfr-${config.mpfr.version} mpfr
-                  ln -s ../mpc-${config.mpc.version} mpc
-                  ln -s ../isl-${config.isl.version} isl
-                '';
-
-                patch = ''
-                  # Patch
-                  # force musl even if host triple is gnu
-                  sed -i 's|"os/gnu-linux"|"os/generic"|' libstdc++-v3/configure.host
-                '';
-
-                configure = ''
-                  # Configure
-                  export CC="gcc -Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so"
-                  export CXX="g++ -Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so"
-                  export CFLAGS_FOR_TARGET="-Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so"
-                  export LIBRARY_PATH="${foundation.stage1-musl}/lib"
-
-                  bash ./configure \
-                    --prefix=$out \
-                    --build=${config.platform.build.triple} \
-                    --host=${config.platform.host.triple} \
-                    --target=${config.platform.target.triple} \
-                    --with-native-system-header-dir=/include \
-                    --with-sysroot=${foundation.stage1-musl} \
-                    --enable-languages=c,c++ \
-                    --disable-bootstrap \
-                    --disable-libsanitizer \
-                    --disable-lto \
-                    --disable-multilib \
-                    --disable-plugin \
-                    CFLAGS=-static \
-                    CXXFLAGS=-static
-                '';
-
-                build = ''
-                  # Build
-                  make -j $NIX_BUILD_CORES
-                '';
-
-                install = ''
-                  # Install
-                  make -j $NIX_BUILD_CORES install-strip
-                '';
-              };
-
-            src = builtins.fetchurl {
-              url = "${mirrors.gnu}/gcc/gcc-${config.version}/gcc-${config.version}.tar.xz";
-              sha256 = "4nXnZEKmBnNBon8Exca4PYYTFEAEwEE1KIY9xrXHQ9o=";
-            };
-
-            gmp = {
-              version = "6.3.0";
-              src = builtins.fetchurl {
-                url = "${mirrors.gnu}/gmp/gmp-${config.gmp.version}.tar.xz";
-                sha256 = "o8K4AgG4nmhhb0rTC8Zq7kknw85Q4zkpyoGdXENTiJg=";
-              };
-            };
-
-            mpfr = {
-              version = "4.2.1";
-              src = builtins.fetchurl {
-                url = "${mirrors.gnu}/mpfr/mpfr-${config.mpfr.version}.tar.xz";
-                sha256 = "J3gHNTpnJpeJlpRa8T5Sgp46vXqaW3+yeTiU4Y8fy7I=";
-              };
-            };
-
-            mpc = {
-              version = "1.3.1";
-              src = builtins.fetchurl {
-                url = "${mirrors.gnu}/mpc/mpc-${config.mpc.version}.tar.gz";
-                sha256 = "q2QkkvXPiCt0qgy3MM1BCoHtzb7IlRg86TDnBsHHWbg=";
-              };
-            };
-
-            isl = {
-              version = "0.24";
-              src = builtins.fetchurl {
-                url = "https://gcc.gnu.org/pub/gcc/infrastructure/isl-${config.isl.version}.tar.bz2";
-                sha256 = "/PeN2WVsEOuM+fvV9ZoLawE4YgX+GTSzsoegoYmBRcA=";
-              };
+            exports = lib.options.create {
+              type = lib.types.attrs.of lib.types.string;
+              description = "List of exports to add to the environment.";
             };
           };
+
+          config =
+            let
+              isBuildBootstrapped = config.platform.build.double == "i686-linux";
+              isHostBootstrapped = config.platform.host.double == "i686-linux";
+
+              isBootstrapped = isBuildBootstrapped && isHostBootstrapped;
+
+              crossTool =
+                (config.platform.target.triple != config.platform.host.triple)
+                && (config.platform.host.triple == config.platform.build.triple);
+              cross =
+                (config.platform.target.triple != config.platform.host.triple)
+                && (config.platform.host.triple == config.platform.target.triple);
+
+              programPrefix = lib.strings.when
+                (
+                  config.platform.build.triple != config.platform.target.triple
+                ) "${config.platform.target.triple}-";
+
+              libc = if isBootstrapped then foundation.stage1-musl else config.deps.build.build.glibc.package;
+              libcLd =
+                if isBootstrapped then
+                  "${foundation.stage1-musl}/lib/libc.so"
+                else
+                  "${config.deps.build.build.glibc.package}/lib/ld-linux-x86-64.so.2";
+
+              host = lib.systems.withBuildInfo config.platform.host;
+              target = lib.systems.withBuildInfo config.platform.target;
+            in
+            {
+              meta = {
+                platforms = [
+                  "i686-linux"
+                ];
+              };
+
+              pname = "gcc-${config.platform.build.double}--${config.platform.host.double}--${config.platform.target.double}";
+              version = "13.2.0";
+
+              builder = builders.basic;
+
+              deps = {
+                build = {
+                  build = lib.modules.when (!isBootstrapped) {
+                    gcc = packages.foundation.gcc-cross.versions.latest;
+                    glibc = packages.foundation.glibc.versions.latest;
+                    linux-headers = packages.foundation.linux-headers.versions.latest;
+                    binutils = packages.foundation.binutils.versions.latest;
+                  };
+                };
+              };
+
+              env =
+                {
+                  PATH = lib.modules.when (isBuildBootstrapped) (
+                    lib.paths.bin ([
+                      foundation.stage2-gnumake
+                      foundation.stage2-gnused
+                      foundation.stage2-gnugrep
+                      foundation.stage2-gnupatch
+                      foundation.stage2-gawk
+                      foundation.stage2-diffutils
+                      foundation.stage2-findutils
+                      foundation.stage2-gnutar
+                      foundation.stage2-gzip
+                      foundation.stage2-bzip2
+                      foundation.stage1-xz
+                    ] ++ (lib.lists.when (isBootstrapped) [
+                      foundation.stage2-gcc
+                      foundation.stage2-binutils
+                    ]))
+                  );
+                  CFLAGS_FOR_TARGET = "-Wl,-dynamic-linker -Wl,${libcLd}";
+                }
+                // lib.attrs.when (isBootstrapped) {
+                  CC = "gcc -Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so";
+                  CXX = "g++ -Wl,-dynamic-linker -Wl,${foundation.stage1-musl}/lib/libc.so";
+                }
+                // lib.attrs.when (!cross && !crossTool) {
+                  LIBRARY_PATH = "${libc}/lib";
+                };
+
+              hooks =
+                let
+                  flags =
+                    if (isBootstrapped && !(cross || crossTool)) then
+                      [
+                        "-Wl,-dynamic-linker"
+                        "-Wl,${foundation.stage1-musl}/lib/libc.so"
+                      ]
+                    else
+                      [
+                        "-Wl,-dynamic-linker"
+                        "-Wl,${config.deps.build.build.glibc.package}/lib/ld-linux${lib.strings.when (target.isx86 && target.is64bit) "-x86-64"}.so.2"
+                        "-B${config.deps.build.build.glibc.package}/lib"
+                        # "-idirafter ${config.deps.build.build.glibc.package}/include"
+                      ];
+                in
+                ctx: {
+                  "aux:gcc:env" = lib.dag.entry.between [ "unpack" ] [ "configure" ] ''
+                    export CC='${config.package}/bin/${programPrefix}gcc  ${builtins.concatStringsSep " " flags}'
+                    export CXX='${config.package}/bin/${programPrefix}g++  ${builtins.concatStringsSep " " flags}'
+                    export CC_FOR_TARGET=$CC
+                    export CXX_FOR_TARGET=$CXX
+                    export CC_FOR_BUILD=$CC
+                    export CXX_FOR_BUILD=$CXX
+                    alias gcc='$CC'
+                    alias g++='$CXX'
+                  '';
+                };
+
+              configureFlags =
+                [
+                  "--prefix=${builtins.placeholder "out"}"
+                  "--build=${config.platform.build.triple}"
+                  "--host=${config.platform.host.triple}"
+                  "--target=${config.platform.target.triple}"
+                  "--enable-languages=c,c++"
+                  "--disable-bootstrap"
+                  "--disable-libsanitizer"
+                  "--disable-multilib"
+                  "--with-build-sysroot=/"
+                  "--with-native-system-header-dir=${libc}/include"
+                ]
+                ++ lib.lists.when (isBootstrapped) [
+                  "--disable-lto"
+                ];
+
+              phases =
+                let
+                  patches = [
+                    # Make binutils output deterministic by default.
+                    ./patches/libstdc++-target.patch
+                  ];
+                in
+                {
+                  unpack = ''
+                    # Unpack
+                    tar xf ${config.src}
+                    tar xf ${config.gmp.src}
+                    tar xf ${config.mpfr.src}
+                    tar xf ${config.mpc.src}
+                    tar xf ${config.isl.src}
+                    cd gcc-${config.version}
+
+                    ln -s ../gmp-${config.gmp.version} gmp
+                    ln -s ../mpfr-${config.mpfr.version} mpfr
+                    ln -s ../mpc-${config.mpc.version} mpc
+                    ln -s ../isl-${config.isl.version} isl
+                  '';
+
+                  patch = ''
+                    ${lib.strings.concatMapSep "\n" (file: "patch -Np1 -i ${file}") patches}
+                    ${lib.strings.when (isBootstrapped && !(crossTool || cross))''
+                      # force musl even if host triple is gnu
+                      sed -i 's|"os/gnu-linux"|"os/generic"|' libstdc++-v3/configure.host
+                    ''}
+                  '';
+
+                  configure = ''
+                    # Configure
+                    mkdir build
+                    cd build
+
+                    bash ../configure ${builtins.concatStringsSep " " config.configureFlags}
+                  '';
+
+                  build = ''
+                    # Build
+                    make -j $NIX_BUILD_CORES
+                  '';
+
+                  install = ''
+                    # Install
+                    ${
+                      lib.strings.when (host.is64bit) ''
+                        mkdir -p $out/lib
+                        ln -s lib $out/lib64
+                      ''
+                    }
+                    make -j $NIX_BUILD_CORES install
+                  '';
+                };
+
+              src = builtins.fetchurl {
+                url = "${mirrors.gnu}/gcc/gcc-${config.version}/gcc-${config.version}.tar.xz";
+                sha256 = "4nXnZEKmBnNBon8Exca4PYYTFEAEwEE1KIY9xrXHQ9o=";
+              };
+
+              gmp = {
+                version = "6.3.0";
+                src = builtins.fetchurl {
+                  url = "${mirrors.gnu}/gmp/gmp-${config.gmp.version}.tar.xz";
+                  sha256 = "o8K4AgG4nmhhb0rTC8Zq7kknw85Q4zkpyoGdXENTiJg=";
+                };
+              };
+
+              mpfr = {
+                version = "4.2.1";
+                src = builtins.fetchurl {
+                  url = "${mirrors.gnu}/mpfr/mpfr-${config.mpfr.version}.tar.xz";
+                  sha256 = "J3gHNTpnJpeJlpRa8T5Sgp46vXqaW3+yeTiU4Y8fy7I=";
+                };
+              };
+
+              mpc = {
+                version = "1.3.1";
+                src = builtins.fetchurl {
+                  url = "${mirrors.gnu}/mpc/mpc-${config.mpc.version}.tar.gz";
+                  sha256 = "q2QkkvXPiCt0qgy3MM1BCoHtzb7IlRg86TDnBsHHWbg=";
+                };
+              };
+
+              isl = {
+                version = "0.24";
+                src = builtins.fetchurl {
+                  url = "https://gcc.gnu.org/pub/gcc/infrastructure/isl-${config.isl.version}.tar.bz2";
+                  sha256 = "/PeN2WVsEOuM+fvV9ZoLawE4YgX+GTSzsoegoYmBRcA=";
+                };
+              };
+            };
         };
     };
   };
diff --git a/tidepool/src/packages/foundation/gcc/newlib.nix b/tidepool/src/packages/foundation/gcc/newlib.nix
new file mode 100644
index 0000000..b098af6
--- /dev/null
+++ b/tidepool/src/packages/foundation/gcc/newlib.nix
@@ -0,0 +1,71 @@
+{ config, options }:
+let
+  inherit (config)
+    lib
+    packages
+    ;
+in
+{
+  config.packages.foundation.gcc-newlib = {
+    versions = {
+      "latest" = config.packages.foundation.gcc.versions.latest.extend (
+        { config }:
+        {
+          config =
+            let
+              programPrefix = lib.strings.when
+                (
+                  config.platform.build.triple != config.platform.target.triple
+                ) "${config.platform.target.triple}-";
+            in
+            {
+              meta = {
+                platforms = lib.modules.override 0 [
+                  "i686-linux"
+                ];
+              };
+
+              deps = {
+                build = {
+                  build = {
+                    binutils = (
+                      packages.foundation.binutils.versions.latest.extend {
+                        platform = lib.modules.override 0 config.platform;
+                      }
+                    );
+                  };
+                };
+              };
+
+              configureFlags = lib.modules.override 0 [
+                "--prefix=${builtins.placeholder "out"}"
+                "--build=${config.platform.build.triple}"
+                "--host=${config.platform.host.triple}"
+                "--target=${config.platform.target.triple}"
+                "--with-as=${config.deps.build.build.binutils.package}/bin/${programPrefix}as"
+                "--with-ld=${config.deps.build.build.binutils.package}/bin/${programPrefix}ld"
+                "--enable-languages=c,c++"
+                "--disable-bootstrap"
+                "--disable-libsanitizer"
+                "--disable-lto"
+                "--disable-multilib"
+                "--disable-plugin"
+                "--disable-libssp"
+                "--disable-libvtv"
+                "--disable-libstdcxx"
+                "--disable-libquadmath"
+                "--disable-threads"
+                "--disable-decimal-float"
+                "--disable-shared"
+                "--disable-libmudflap"
+                "--disable-libgomp"
+                "--disable-libatomic"
+                "--without-headers"
+                "--with-newlib"
+              ];
+            };
+        }
+      );
+    };
+  };
+}
diff --git a/tidepool/src/packages/foundation/gcc/patches/libstdc++-target.patch b/tidepool/src/packages/foundation/gcc/patches/libstdc++-target.patch
new file mode 100644
index 0000000..2fa8883
--- /dev/null
+++ b/tidepool/src/packages/foundation/gcc/patches/libstdc++-target.patch
@@ -0,0 +1,33 @@
+# From https://github.com/NixOS/nixpkgs/blob/nixos-24.05/pkgs/development/compilers/gcc/patches/libstdc%2B%2B-target.patch
+Patch to make the target libraries 'configure' scripts find the proper CPP.
+I noticed that building the mingw32 cross compiler.
+Looking at the build script for mingw in archlinux, I think that only nixos
+needs this patch. I don't know why.
+diff --git a/Makefile.in b/Makefile.in
+index 93f66b6..d691917 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -266,6 +266,7 @@ BASE_TARGET_EXPORTS = \
+ 	AR="$(AR_FOR_TARGET)"; export AR; \
+ 	AS="$(COMPILER_AS_FOR_TARGET)"; export AS; \
+ 	CC="$(CC_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CC; \
++	CPP="$(CC_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS -E"; export CC; \
+ 	CFLAGS="$(CFLAGS_FOR_TARGET)"; export CFLAGS; \
+ 	CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \
+ 	CPPFLAGS="$(CPPFLAGS_FOR_TARGET)"; export CPPFLAGS; \
+@@ -291,11 +292,13 @@ BASE_TARGET_EXPORTS = \
+ RAW_CXX_TARGET_EXPORTS = \
+ 	$(BASE_TARGET_EXPORTS) \
+ 	CXX_FOR_TARGET="$(RAW_CXX_FOR_TARGET)"; export CXX_FOR_TARGET; \
+-	CXX="$(RAW_CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX;
++	CXX="$(RAW_CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX; \
++	CXXCPP="$(RAW_CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS -E"; export CXX;
+ 
+ NORMAL_TARGET_EXPORTS = \
+ 	$(BASE_TARGET_EXPORTS) \
+-	CXX="$(CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX;
++	CXX="$(CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX; \
++	CXXCPP="$(CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS -E"; export CXX;
+ 
+ # Where to find GMP
+ HOST_GMPLIBS = @gmplibs@
\ No newline at end of file
diff --git a/tidepool/src/packages/foundation/glibc/default.nix b/tidepool/src/packages/foundation/glibc/default.nix
index 8e8de03..b8e11ce 100644
--- a/tidepool/src/packages/foundation/glibc/default.nix
+++ b/tidepool/src/packages/foundation/glibc/default.nix
@@ -3,6 +3,7 @@
   lib',
   config,
   options,
+  packages,
 }:
 let
   inherit (config)
@@ -10,6 +11,7 @@ let
     builders
     # These are the upstream foundational packages exported from the Aux Foundation project.
 
+    packages
     foundation
     ;
 in
@@ -26,87 +28,124 @@ in
             };
           };
 
-          config = {
-            meta = {
-              platforms = [ "i686-linux" ];
-            };
+          config =
+            let
+              isCross =
+                (config.platform.build.triple != config.platform.host.triple)
+                && (config.platform.host.triple == config.platform.target.triple);
 
-            pname = "gcc";
-            version = "2.38";
+              binutils =
+                if isCross then
+                  "${
+                    (packages.foundation.binutils.versions.latest.extend {
+                      platform = lib.modules.override 0 {
+                        inherit (config.platform) build target;
+                        host = config.platform.build;
+                      };
+                    }).package
+                  }/${config.platform.target.triple}"
+                else
+                  foundation.stage2-binutils;
+            in
+            {
 
-            src = builtins.fetchurl {
-              url = "${mirrors.gnu}/libc/glibc-${config.version}.tar.xz";
-              sha256 = "+4KZiZiyspllRnvBtp0VLpwwfSzzAcnq+0VVt3DvP9I=";
-            };
-
-            builder = builders.basic;
-
-            env = {
-              PATH =
-                let
-                  gcc =
-                    if
-                      config.platform.build.triple == config.platform.host.triple
-                    # If we're on the same system then we can use the existing GCC instance.
-                    then
-                      foundation.stage2-gcc
-                    # Otherwise we are going to need a cross-compiler.
-                    else
-                      (meta.extend (args: {
-                        config = {
-                          platform = {
-                            build = config.platform.build.triple;
-                            host = config.platform.build.triple;
-                            target = lib.modules.override.force config.platform.host.triple;
-                          };
-                        };
-                      })).config.package;
-                in
-                lib.paths.bin [
-                  foundation.stage2-gcc
-                  foundation.stage2-binutils
-                  foundation.stage2-gnumake
-                  foundation.stage2-gnused
-                  foundation.stage2-gnugrep
-                  foundation.stage2-gawk
-                  foundation.stage2-diffutils
-                  foundation.stage2-findutils
-                  foundation.stage2-gnutar
-                  foundation.stage2-gzip
-                  foundation.stage2-bzip2
-                  foundation.stage1-xz
+              meta = {
+                platforms = [
+                  "i686-linux"
+                  "x86_64-linux"
                 ];
+              };
+
+              pname = "glibc";
+              version = "2.38";
+
+              src = builtins.fetchurl {
+                url = "${mirrors.gnu}/libc/glibc-${config.version}.tar.xz";
+                sha256 = "+4KZiZiyspllRnvBtp0VLpwwfSzzAcnq+0VVt3DvP9I=";
+              };
+
+              builder = builders.basic;
+
+              deps = {
+                build = {
+                  host = {
+                    linux-headers = (
+                      packages.foundation.linux-headers.versions.latest.extend {
+                        platform.target = lib.modules.override 0 config.platform.target;
+                      }
+                    );
+                  };
+                };
+              };
+
+              env = {
+                PATH =
+                  let
+                    gcc =
+                      if
+                        isCross
+                      # Otherwise we are going to need a cross-compiler.
+                      then
+                        (packages.foundation.gcc-newlib.versions.latest.extend {
+                          platform = lib.modules.override 0 {
+                            inherit (config.platform) build target;
+                            host = config.platform.build;
+                          };
+                        }).package
+                      # If we're on the same system then we can use the existing GCC instance.
+                      else
+                        foundation.stage2-gcc;
+                  in
+                  lib.paths.bin [
+                    gcc
+                    binutils
+                    foundation.stage2-gnumake
+                    foundation.stage2-gnused
+                    foundation.stage2-gnugrep
+                    foundation.stage2-gawk
+                    foundation.stage2-diffutils
+                    foundation.stage2-findutils
+                    foundation.stage2-gnutar
+                    foundation.stage2-gzip
+                    foundation.stage2-bzip2
+                    foundation.stage1-python
+                    foundation.stage1-bison
+                    foundation.stage1-xz
+                  ];
+              };
+
+              phases =
+
+                {
+                  unpack = ''
+                    tar xf ${config.src}
+                    cd glibc-${config.version}
+                  '';
+
+                  configure = ''
+                    mkdir build
+                    cd build
+
+                    bash ../configure \
+                      --prefix=$out \
+                      --build=${config.platform.build.triple} \
+                      --host=${config.platform.host.triple} \
+                      --with-headers=${config.deps.build.host.linux-headers.package}/include \
+                      --with-binutils=${binutils}/bin
+                  '';
+
+                  build = ''
+                    # Build
+                    make -j $NIX_BUILD_CORES
+                  '';
+
+                  install = ''
+                    # Install
+                    make -j $NIX_BUILD_CORES install
+                    ln -sv $(ls -d ${config.deps.build.host.linux-headers.package}/include/* | grep -v scsi\$) $out/include/
+                  '';
+                };
             };
-
-            phases = {
-              unpack = ''
-                tar xf ${config.src}
-                cd glibc-${config.version}
-              '';
-
-              configure = ''
-                mkdir build
-                cd build
-                # libstdc++.so is built against musl and fails to link
-                export CXX=false
-                bash ../configure \
-                  --prefix=$out \
-                  --build=${config.platform.build.triple} \
-                  --host=${config.platform.host.triple} \
-                  --with-headers=${foundation.stage1-linux-headers}/include
-              '';
-
-              build = ''
-                # Build
-                make -j $NIX_BUILD_CORES
-              '';
-
-              install = ''
-                # Install
-                make -j $NIX_BUILD_CORES install-strip
-              '';
-            };
-          };
         };
     };
   };
diff --git a/tidepool/src/packages/foundation/linux-headers/default.nix b/tidepool/src/packages/foundation/linux-headers/default.nix
index 2201046..a2fad63 100644
--- a/tidepool/src/packages/foundation/linux-headers/default.nix
+++ b/tidepool/src/packages/foundation/linux-headers/default.nix
@@ -1,8 +1,8 @@
-{
-  lib,
-  lib',
-  config,
-  options,
+{ lib
+, lib'
+, config
+, options
+,
 }:
 let
   inherit (config)
@@ -28,7 +28,7 @@ in
 
           config = {
             meta = {
-              platforms = [ "i686-linux" ];
+              platforms = [ "x86_64-linux" "i686-linux" ];
             };
 
             pname = "linux-headers";
@@ -60,7 +60,7 @@ in
               '';
 
               build = ''
-                make -j $NIX_BUILD_CORES CC=musl-gcc HOSTCC=musl-gcc ARCH=${config.platform.host.linux.arch} headers
+                make -j $NIX_BUILD_CORES CC=musl-gcc HOSTCC=musl-gcc ARCH=${config.platform.target.linux.arch} headers
               '';
 
               install = ''