¿Es un ejecutable portátil entre diferentes hosts Nixos que hacen referencia a diferentes confirmaciones de nixpkg?

¿Es un ejecutable portátil entre diferentes hosts Nixos que hacen referencia a diferentes confirmaciones de nixpkg?

Estoy intentando que un ejecutable funcione simplemente copiándolo directamente de un host Nixos a otro. Funciona/ejecuta solo en uno de los hosts.

En el host antiguo (donde 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)

En el nuevo host no encuentra la biblioteca compartida:

[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


Sin embargo , veo un libpq.soarchivo en el directorio postgresql-lib en el nuevo 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

Tengo los [glibc gmp5 postgresql postgresql.lib zlib.dev zlib.out]paquetes instalados en mi environment.systemPackages.

Respuesta1

Los paquetes creados por Nix generalmente se basan en DT_RUNPATHla entrada de archivos ELF para localizar bibliotecas compartidas. Puede utilizar, por ejemplo, nix run -f . patchelf -c patchelf --print-rpath apppara ver las entradas. En su caso devolverá algo como esto:

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

Dado que estas son rutas absolutas, necesitará tener las rutas relevantes en la tienda Nix para encontrar las bibliotecas.

Si conoce la nixpkgsconfirmación que utilizó para crear el programa, puede ejecutarlo nix-build -f https://github.com/NixOS/nixpkgs/archive/${commit}.tar.gz -A postgresql.liben la segunda computadora para agregar la biblioteca a la tienda. Pero tenga en cuenta que, a menos que lo agregue a la raíz del GC, un recolector de basura puede borrarlo.

Si creó su programa como una expresión Nix, es bastante fácilexportar todo el cierree importarlo a otra computadora.

información relacionada