
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.so
archivo 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_RUNPATH
la entrada de archivos ELF para localizar bibliotecas compartidas. Puede utilizar, por ejemplo, nix run -f . patchelf -c patchelf --print-rpath app
para 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 nixpkgs
confirmación que utilizó para crear el programa, puede ejecutarlo nix-build -f https://github.com/NixOS/nixpkgs/archive/${commit}.tar.gz -A postgresql.lib
en 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.