1{ config, lib, pkgs, ... }:
2
3let
4 inherit (lib) optionalString mkOption types mkIf mkDefault;
5
6 cfg = config.environment.stub-ld;
7
8 message = ''
9 NixOS cannot run dynamically linked executables intended for generic
10 linux environments out of the box. For more information, see:
11 https://nix.dev/permalink/stub-ld
12 '';
13
14 stub-ld-for = pkgsArg: messageArg: pkgsArg.pkgsStatic.runCommandCC "stub-ld" {
15 nativeBuildInputs = [ pkgsArg.unixtools.xxd ];
16 inherit messageArg;
17 } ''
18 printf "%s" "$messageArg" | xxd -i -n message >main.c
19 cat <<EOF >>main.c
20 #include <stdio.h>
21 int main(int argc, char * argv[]) {
22 fprintf(stderr, "Could not start dynamically linked executable: %s\n", argv[0]);
23 fwrite(message, sizeof(unsigned char), message_len, stderr);
24 return 127; // matches behavior of bash and zsh without a loader. fish uses 139
25 }
26 EOF
27 $CC -Os main.c -o $out
28 '';
29
30 pkgs32 = pkgs.pkgsi686Linux;
31
32 stub-ld = stub-ld-for pkgs message;
33 stub-ld32 = stub-ld-for pkgs32 message;
34in {
35 options = {
36 environment.stub-ld = {
37 enable = mkOption {
38 type = types.bool;
39 default = true;
40 example = false;
41 description = ''
42 Install a stub ELF loader to print an informative error message
43 in the event that a user attempts to run an ELF binary not
44 compiled for NixOS.
45 '';
46 };
47 };
48 };
49
50 config = mkIf cfg.enable {
51 environment.ldso = mkDefault stub-ld;
52 environment.ldso32 = mkIf pkgs.stdenv.isx86_64 (mkDefault stub-ld32);
53 };
54
55 meta.maintainers = with lib.maintainers; [ tejing ];
56}