$ type -a gcc
gcc is /home/cql/.nix-profile/bin/gcc
It could be useful to run a nested shell in this case:
$ LD_DEBUG=libs zsh
$ ./main
It will show you the libraries each command will try to load.
heres everything after pressing enter on ./main
zsh: no such file or directory: ./main
19838: find library=libc.so.6 [0]; searching
19838: search path=/nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib/glibc-hwcaps/x86-64-v3:/nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib/glibc-hwcaps/x86-64-v2:/nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib (system search path)
19838: trying file=/nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib/glibc-hwcaps/x86-64-v3/libc.so.6
19838: trying file=/nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib/glibc-hwcaps/x86-64-v2/libc.so.6
19838: trying file=/nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib/libc.so.6
19838:
19838: find library=libgcc_s.so.1 [0]; searching
19838: search path=/nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib (system search path)
19838: trying file=/nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib/libgcc_s.so.1
19838: search path=/nix/store/p3ffjixpnfgkqh20nsrc13vrj3yfi0nj-gcc-13.2.0-lib/lib/glibc-hwcaps/x86-64-v3:/nix/store/p3ffjixpnfgkqh20nsrc13vrj3yfi0nj-gcc-13.2.0-lib/lib/glibc-hwcaps/x86-64-v2:/nix/store/p3ffjixpnfgkqh20nsrc13vrj3yfi0nj-gcc-13.2.0-lib/lib (RUNPATH from file /home/cql/.nix-profile/bin/starship)
19838: trying file=/nix/store/p3ffjixpnfgkqh20nsrc13vrj3yfi0nj-gcc-13.2.0-lib/lib/glibc-hwcaps/x86-64-v3/libgcc_s.so.1
19838: trying file=/nix/store/p3ffjixpnfgkqh20nsrc13vrj3yfi0nj-gcc-13.2.0-lib/lib/glibc-hwcaps/x86-64-v2/libgcc_s.so.1
19838: trying file=/nix/store/p3ffjixpnfgkqh20nsrc13vrj3yfi0nj-gcc-13.2.0-lib/lib/libgcc_s.so.1
19838:
19838: find library=libm.so.6 [0]; searching
19838: search path=/nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib (system search path)
19838: trying file=/nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib/libm.so.6
19838:
19838:
19838: calling init: /nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib/ld-linux-x86-64.so.2
19838:
19838:
19838: calling init: /nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib/libc.so.6
Alright, so I found an interesting project nix-alien which allows you to run unpatched binaries.
Inside the project directory, run:
$ nix --extra-experimental-features "nix-command flakes" run github:thiagokokada/nix-alien -- ./main
If that worked, the following command will show you which libs are needed:
$ nix --extra-experimental-features "nix-command flakes" run github:thiagokokada/nix-alien#nix-alien-find-libs -- ./main
I tried this on a random non-NixOS program and it worked nicely.
If after all of this and it still doesnât run, I think this might be an issue with the project itself or something else like a permission errorâŚ
When you run the first command, does it show you a list of libraries and asks you to choose or does it just launch the program?
Try running the next command:
$ nix --extra-experimental-features "nix-command flakes" run github:thiagokokada/nix-alien#nix-alien-ld -- ./main
It will create a cached shell in '~/.cache/nix-alien
and give you its path. When you open it, you should see the libraries it loads in NIX_LD_LIBRARY_PATH
:
Example
{ pkgs ? import
(builtins.fetchTarball {
name = "nixpkgs-unstable-20240509145238";
url = "https://github.com/NixOS/nixpkgs/archive/f1010e0469db743d14519a1efd37e23f8513d714.tar.gz";
sha256 = "sha256-doPgfj+7FFe9rfzWo1siAV2mVCasW+Bh8I1cToAXEE4=";
})
{ }
}:
let
inherit (pkgs) lib stdenv;
NIX_LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [
gmp.out
libz.out
];
NIX_LD = lib.fileContents "${stdenv.cc}/nix-support/dynamic-linker";
in
pkgs.writeShellScriptBin "anki-panky" ''
export NIX_LD_LIBRARY_PATH='${NIX_LD_LIBRARY_PATH}'${"\${NIX_LD_LIBRARY_PATH:+':'}$NIX_LD_LIBRARY_PATH"}
export NIX_LD='${NIX_LD}'
/home/user/Downloads/anki-panky "$@"
''
For this example, itâs libz
and gmp
.
nope, totally blank.
let
inherit (pkgs) lib stdenv;
NIX_LD_LIBRARY_PATH = with pkgs; lib.makeLibraryPath [
];
NIX_LD = lib.fileContents "${stdenv.cc}/nix-support/dynamic-linker";
in
How odd⌠Well, since weâve gotten this far, we might as well see what is being loaded with LD_DEBUG=libs
when it does work:
$ LD_DEBUG=libs nix --extra-experimental-features "nix-command flakes" run github:thiagokokada/nix-alien -- ./main
Thanks, if you could do this as well, what does the following give you?
$ nix-shell -p patchelf --run "patchelf --print-needed ./main"
libresolv.so.2
libpthread.so.0
libc.so.6
i added glibc under nix-ld.libraries and it started working, bruh.
I was gonna say, those three libraries appear in the following derivations:
$ nix-locate libc.so.6 | grep glibc
(zsnes.out) 2,550,384 x /nix/store/80h8wkvzf60012mnkik703ifzc1w1kyl-glibc-2.39-31/lib/libc.so.6
(hare.out) 2,122,232 x /nix/store/s5wxag65m62a2bg2lg82jb3nqc42wyi6-glibc-aarch64-unknown-linux-gnu-2.39-31/lib/libc.so.6
(hare.out) 1,759,184 x /nix/store/brnz0ga886s09gkmjd0nwhvirjwaph7w-glibc-riscv64-unknown-linux-gnu-2.39-31/lib/libc.so.6
iconv.out 2,285,600 x /nix/store/apab5i73dqa09wx0q27b6fbhd1r18ihl-glibc-2.39-31/lib/libc.so.6
glibc_multi.out 0 s /nix/store/s4gcddkm2kvb02qnrm2rq22lj8yynqhw-glibc-multi-2.39-31/lib/libc.so.6
glibc_memusage.debug 0 s /nix/store/ssai8vvm9hvhjc7i6acpma6fv66dz19a-glibc-gd-2.39-31-debug/lib/debug/libc.so.6
iconv.debug 0 s /nix/store/0k9qgiqxjlhh71pj7a2czz33ir3nv720-glibc-2.39-31-debug/lib/debug/libc.so.6
glibc_memusage.out 2,285,600 x /nix/store/bimkvwhg1wrg4fmzf6aqhy68m8b12q9a-glibc-gd-2.39-31/lib/libc.so.6
I think just installing glibc_multi
will just solve the issue.
Is this what you had in mind?
programs.nix-ld.libraries = with pkgs; [
glibc_multi
];
I meant just as a normal package, if only to test, but if that doesnât work then using nix-ld would indeed be the way to go.
Thank you, this solution works perfectly. I will now mark this as resolved.
Which one solved it, installing as a package or nix-ld?
I installed it as a global package in configuration.nix
environment.systemPackages = with pkgs; [ glibc_multi ];