diff --git a/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml b/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
index 9846d21775c7..fc7cb28ffdfd 100644
--- a/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
+++ b/nixos/doc/manual/from_md/release-notes/rl-2205.section.xml
@@ -282,6 +282,13 @@
services.nbd.
+
+
+ nix-ld,
+ Run unpatched dynamic binaries on NixOS. Available as
+ programs.nix-ld.
+
+
timetagger,
diff --git a/nixos/doc/manual/release-notes/rl-2205.section.md b/nixos/doc/manual/release-notes/rl-2205.section.md
index f2f77afa5577..2ff5865b7355 100644
--- a/nixos/doc/manual/release-notes/rl-2205.section.md
+++ b/nixos/doc/manual/release-notes/rl-2205.section.md
@@ -81,6 +81,8 @@ In addition to numerous new and upgraded packages, this release has the followin
- [nbd](https://nbd.sourceforge.io/), a Network Block Device server. Available as [services.nbd](options.html#opt-services.nbd.server.enable).
+- [nix-ld](https://github.com/Mic92/nix-ld), Run unpatched dynamic binaries on NixOS. Available as [programs.nix-ld](options.html#opt-programs.nix-ld.enable).
+
- [timetagger](https://timetagger.app), an open source time-tracker with an intuitive user experience and powerful reporting. [services.timetagger](options.html#opt-services.timetagger.enable).
- [rstudio-server](https://www.rstudio.com/products/rstudio/#rstudio-server), a browser-based version of the RStudio IDE for the R programming language. Available as [services.rstudio-server](options.html#opt-services.rstudio-server.enable).
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index c36c77874444..e80c6cf90f54 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -181,6 +181,7 @@
./programs/mtr.nix
./programs/nano.nix
./programs/nbd.nix
+ ./programs/nix-ld.nix
./programs/neovim.nix
./programs/nm-applet.nix
./programs/npm.nix
diff --git a/nixos/modules/programs/nix-ld.nix b/nixos/modules/programs/nix-ld.nix
new file mode 100644
index 000000000000..810a74ab50b7
--- /dev/null
+++ b/nixos/modules/programs/nix-ld.nix
@@ -0,0 +1,12 @@
+{ pkgs, lib, config, ... }:
+{
+ meta.maintainers = [ lib.maintainers.mic92 ];
+ options = {
+ programs.nix-ld.enable = lib.mkEnableOption ''nix-ld, Documentation: '';
+ };
+ config = lib.mkIf config.programs.nix-ld.enable {
+ systemd.tmpfiles.rules = [
+ "L+ ${pkgs.nix-ld.ldPath} - - - - ${pkgs.nix-ld}/libexec/nix-ld"
+ ];
+ };
+}
diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix
index 474bb4233792..b6311f856fa8 100644
--- a/nixos/tests/all-tests.nix
+++ b/nixos/tests/all-tests.nix
@@ -356,6 +356,7 @@ in
nginx-sso = handleTest ./nginx-sso.nix {};
nginx-variants = handleTest ./nginx-variants.nix {};
nitter = handleTest ./nitter.nix {};
+ nix-ld = handleTest ./nix-ld {};
nix-serve = handleTest ./nix-serve.nix {};
nix-serve-ssh = handleTest ./nix-serve-ssh.nix {};
nixops = handleTest ./nixops/default.nix {};
diff --git a/nixos/tests/nix-ld.nix b/nixos/tests/nix-ld.nix
new file mode 100644
index 000000000000..5c886182d969
--- /dev/null
+++ b/nixos/tests/nix-ld.nix
@@ -0,0 +1,20 @@
+import ./make-test-python.nix ({ lib, pkgs, ...} :
+{
+ name = "nix-ld";
+ nodes.machine = { pkgs, ... }: {
+ programs.nix-ld.enable = true;
+ environment.systemPackages = [
+ (pkgs.runCommand "patched-hello" {} ''
+ install -D -m755 ${pkgs.hello}/bin/hello $out/bin/hello
+ patchelf $out/bin/hello --set-interpreter ${pkgs.nix-ld.ldPath}
+ '')
+ ];
+ };
+ testScript = ''
+ start_all()
+ path = "${pkgs.stdenv.cc}/nix-support/dynamic-linker"
+ with open(path) as f:
+ real_ld = f.read().strip()
+ machine.succeed(f"NIX_LD={real_ld} hello")
+ '';
+})
diff --git a/pkgs/os-specific/linux/nix-ld/default.nix b/pkgs/os-specific/linux/nix-ld/default.nix
new file mode 100644
index 000000000000..dcab99cabfe4
--- /dev/null
+++ b/pkgs/os-specific/linux/nix-ld/default.nix
@@ -0,0 +1,49 @@
+{ stdenv, meson, ninja, lib, nixosTests, fetchFromGitHub }:
+let
+ self = stdenv.mkDerivation {
+ name = "nix-ld";
+ src = fetchFromGitHub {
+ owner = "Mic92";
+ repo = "nix-ld";
+ rev = "1.0.0";
+ sha256 = "sha256-QYPg8wPpq7q5Xd1jW17Lh36iKFSsVkN/gWYoQRv2XoU=";
+ };
+
+ doCheck = true;
+
+ nativeBuildInputs = [ meson ninja ];
+
+ mesonFlags = [
+ "-Dnix-system=${stdenv.system}"
+ ];
+
+ hardeningDisable = [
+ "stackprotector"
+ ];
+
+ postInstall = ''
+ mkdir -p $out/nix-support
+ basename $(< ${stdenv.cc}/nix-support/dynamic-linker) > $out/nix-support/ld-name
+ '';
+
+ passthru.tests.nix-ld = nixosTests.nix-ld;
+ passthru.ldPath = let
+ libDir = if stdenv.system == "x86_64-linux" ||
+ stdenv.system == "mips64-linux" ||
+ stdenv.system == "powerpc64le-linux"
+ then
+ "/lib64"
+ else
+ "/lib";
+ ldName = lib.fileContents "${self}/nix-support/ld-name";
+ in "${libDir}/${ldName}";
+
+ meta = with lib; {
+ description = "Run unpatched dynamic binaries on NixOS";
+ homepage = "https://github.com/Mic92/nix-ld";
+ license = licenses.mit;
+ maintainers = with maintainers; [ mic92 ];
+ platforms = platforms.linux;
+ };
+ };
+in self
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index b544f1e0e6b7..314023dcc2bb 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -27849,6 +27849,8 @@ with pkgs;
nixos-shell = callPackage ../tools/virtualization/nixos-shell {};
+ nix-ld = callPackage ../os-specific/linux/nix-ld {};
+
noaa-apt = callPackage ../applications/radio/noaa-apt { };
node-problem-detector = callPackage ../applications/networking/cluster/node-problem-detector { };