あるNixosホストから別のホストに実行可能ファイルを直接コピーして操作しようとしています。 1つのホストでのみ動作/実行されます。
前のホスト(動作する場所)から:
[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
2番目のコンピューターでプログラムを実行してライブラリを非表示に追加できます。ただし、GCルートに追加しないと、ガベージコレクタによって消去される可能性があることに注意してください。
プログラムをNix式で構成するのは簡単です。フルクロージャーのエクスポート別のコンピュータにインポートします。