Um executável é portátil entre diferentes hosts Nixos que fazem referência a diferentes commits do nixpkg?

Um executável é portátil entre diferentes hosts Nixos que fazem referência a diferentes commits do nixpkg?

Estou tentando fazer um executável funcionar apenas copiando-o diretamente de um host Nixos para outro. Funciona/executa em apenas um dos hosts.

No host antigo (onde funciona):

[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)

No novo host não está encontrando a biblioteca compartilhada:

[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


Eu vejo um libpq.soarquivo no diretório postgresql-lib no novo host:

[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

Eu tenho os [glibc gmp5 postgresql postgresql.lib zlib.dev zlib.out]pacotes instalados no meu environment.systemPackages.

Responder1

Pacotes construídos pelo Nix geralmente dependem de DT_RUNPATHentradas em arquivos ELF para localizar bibliotecas compartilhadas. Você pode usar, por exemplo, nix run -f . patchelf -c patchelf --print-rpath apppara visualizar as entradas. No seu caso retornará algo assim:

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

Como esses caminhos são absolutos, você precisará ter os caminhos relevantes na loja Nix para que as bibliotecas sejam encontradas.

Se você souber o nixpkgscommit usado para construir o programa, poderá executar nix-build -f https://github.com/NixOS/nixpkgs/archive/${commit}.tar.gz -A postgresql.libno segundo computador para adicionar a biblioteca à loja. Mas tenha cuidado, a menos que você o adicione à raiz do GC, ele poderá ser limpo por um coletor de lixo.

Se você construiu seu programa como uma expressão Nix, é muito fácilexportar todo o fechamentoe importe-o para outro computador.

informação relacionada