한 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
DT_RUNPATH
Nix에서 빌드한 패키지는 공유 라이브러리를 찾기 위해 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 스토어에 관련 경로가 있어야 합니다.
nixpkgs
프로그램을 빌드하는 데 사용된 커밋을 알고 있는 경우 nix-build -f https://github.com/NixOS/nixpkgs/archive/${commit}.tar.gz -A postgresql.lib
두 번째 컴퓨터에서 프로그램을 실행하여 라이브러리를 숨김에 추가할 수 있습니다. 하지만 GC 루트에 추가하지 않으면 가비지 수집기에 의해 지워질 수 있다는 점에 유의하세요.
프로그램을 Nix 표현식으로 구성하면 쉽습니다.전체 클로저 내보내기다른 컴퓨터로 가져옵니다.