about summary refs log tree commit diff
path: root/nixos/modules/system
diff options
context:
space:
mode:
authorvolth <volth@volth.com>2019-09-18 22:34:41 +0000
committervolth <volth@volth.com>2019-09-18 22:41:52 +0000
commitaf665d822a166ae62547c1c310207f11acaded17 (patch)
tree14c814401499b87b744b2e2b0c8beccea1625c8f /nixos/modules/system
parente598c4001fda0088506cdc12bf8053705c46676d (diff)
downloadnixlib-af665d822a166ae62547c1c310207f11acaded17.tar
nixlib-af665d822a166ae62547c1c310207f11acaded17.tar.gz
nixlib-af665d822a166ae62547c1c310207f11acaded17.tar.bz2
nixlib-af665d822a166ae62547c1c310207f11acaded17.tar.lz
nixlib-af665d822a166ae62547c1c310207f11acaded17.tar.xz
nixlib-af665d822a166ae62547c1c310207f11acaded17.tar.zst
nixlib-af665d822a166ae62547c1c310207f11acaded17.zip
add config.environment.ld-linux
Add option to install symlink to ld-linux(8) system-wide to allow running unmodified ELF binaries.
It might be useful to run games or executables distributed inside jar files as discussed
https://discourse.nixos.org/t/runtime-alternative-to-patchelf-set-interpreter/3539
https://discourse.nixos.org/t/running-binaries-without-fhs-and-patchelf/1828

It is the third concession to FHS after `/bin/sh` and `/usr/bin/env` but it is disabled by default unlike those two
Diffstat (limited to 'nixos/modules/system')
-rw-r--r--nixos/modules/system/activation/activation-script.nix31
1 files changed, 31 insertions, 0 deletions
diff --git a/nixos/modules/system/activation/activation-script.nix b/nixos/modules/system/activation/activation-script.nix
index ddfd1af4a319..9141c8222b73 100644
--- a/nixos/modules/system/activation/activation-script.nix
+++ b/nixos/modules/system/activation/activation-script.nix
@@ -162,6 +162,16 @@ in
         <literal>/usr/bin/env</literal>.
       '';
     };
+
+    environment.ld-linux = mkOption {
+      default = false;
+      type = types.bool;
+      visible = false;
+      description = ''
+        Install symlink to ld-linux(8) system-wide to allow running unmodified ELF binaries.
+        It might be useful to run games or executables distributed inside jar files.
+      '';
+    };
   };
 
 
@@ -198,6 +208,27 @@ in
         rmdir --ignore-fail-on-non-empty /usr/bin /usr
       '';
 
+    system.activationScripts.ld-linux =
+      concatStrings (
+        mapAttrsToList
+          (target: source:
+            if config.environment.ld-linux then ''
+              mkdir -m 0755 -p $(dirname ${target})
+              ln -sfn ${escapeShellArg source} ${target}.tmp
+              mv -f ${target}.tmp ${target} # atomically replace
+            '' else ''
+              rm -f ${target}
+              rmdir --ignore-fail-on-non-empty $(dirname ${target})
+            '')
+          {
+            "i686-linux"   ."/lib/ld-linux.so.2"          = "${pkgs.glibc.out}/lib/ld-linux.so.2";
+            "x86_64-linux" ."/lib/ld-linux.so.2"          = "${pkgs.pkgsi686Linux.glibc.out}/lib/ld-linux.so.2";
+            "x86_64-linux" ."/lib64/ld-linux-x86-64.so.2" = "${pkgs.glibc.out}/lib64/ld-linux-x86-64.so.2";
+            "aarch64-linux"."/lib/ld-linux-aarch64.so.1"  = "${pkgs.glibc.out}/lib/ld-linux-aarch64.so.1";
+            "armv7l-linux" ."/lib/ld-linux-armhf.so.3"    = "${pkgs.glibc.out}/lib/ld-linux-armhf.so.3";
+          }.${pkgs.stdenv.system} or {}
+      );
+
     system.activationScripts.specialfs =
       ''
         specialMount() {