Переносится ли исполняемый файл между разными хостами Nixos, ссылающимися на разные коммиты nixpkg?

Переносится ли исполняемый файл между разными хостами Nixos, ссылающимися на разные коммиты nixpkg?

Я пытаюсь заставить исполняемый файл работать, просто копируя его напрямую с одного хоста Nixos на другой. Он работает/выполняется только на одном из хостов.

На старом хосте (где работает):

[root@XenonKiloCranberry:~/blog]# ldd app
    linux-vdso.so.1 (0x00007fffd68fb000)
    libm.so.6 => /nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib/libm.so.6 (0x00007f591bf32000)
    libpq.so.5 => /nix/store/sf3jq8d81gx6fmxsi0mhagpgsgpnxf6m-postgresql-9.6.12-lib/lib/libpq.so.5 (0x00007f591bd03000)

На новом хосте не находит общую библиотеку:

[root@XenonKiloCranberry:~/blog]# ldd /root/blog/app
    linux-vdso.so.1 (0x00007fff6cb89000)
    libm.so.6 => /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libm.so.6 (0x00007f927e00f000)
    libpq.so.5 => not found


Однако я вижу libpq.soфайл в каталоге postgresql-lib на новом хосте:

[root@XenonKiloCranberry:~/blog]# ll /nix/store/1m0kd7v8yvf5vdmd2jm16w4aal234114-postgresql-9.6.13-lib/lib/libpq.so
lrwxrwxrwx 1 root root 12 Jan  1  1970 /nix/store/1m0kd7v8yvf5vdmd2jm16w4aal234114-postgresql-9.6.13-lib/lib/libpq.so -> libpq.so.5.9
[root@XenonKiloCranberry:~/blog]# ll /nix/var/nix/profiles/system/sw/lib/libpq.so.5
lrwxrwxrwx 1 root root 80 Jan  1  1970 /nix/var/nix/profiles/system/sw/lib/libpq.so.5 -> /nix/store/1m0kd7v8yvf5vdmd2jm16w4aal234114-postgresql-9.6.13-lib/lib/libpq.so.5

У меня [glibc gmp5 postgresql postgresql.lib zlib.dev zlib.out]установлены пакеты в моем environment.systemPackages.

решение1

Пакеты, созданные Nix, обычно полагаются на DT_RUNPATHзапись в файлах ELF для поиска общих библиотек. Вы можете использовать, например, nix run -f . patchelf -c patchelf --print-rpath appдля просмотра записей. В вашем случае это вернет что-то вроде этого:

/nix/store/7gx4kiv5m0i7d7qkixq2cwzbr10lvxwc-glibc-2.27/lib:/nix/store/sf3jq8d81gx6fmxsi0mhagpgsgpnxf6m-postgresql-9.6.12-lib/lib

Поскольку это абсолютные пути, для поиска библиотек вам понадобятся соответствующие пути в Nix Store.

Если вы знаете nixpkgsкоммит, который вы использовали для сборки программы, вы можете запустить его nix-build -f https://github.com/NixOS/nixpkgs/archive/${commit}.tar.gz -A postgresql.libна втором компьютере, чтобы добавить библиотеку в хранилище. Но будьте осторожны, если вы не добавите его в корень GC, он может быть очищен сборщиком мусора.

Если вы создали свою программу как выражение Nix, то это довольно легкоэкспортировать все закрытиеи импортируйте его на другой компьютер.

Связанный контент