Ist eine ausführbare Datei zwischen verschiedenen Nixos-Hosts portierbar, die auf unterschiedliche Nixpkg-Commits verweisen?

Ist eine ausführbare Datei zwischen verschiedenen Nixos-Hosts portierbar, die auf unterschiedliche Nixpkg-Commits verweisen?

Ich versuche, eine ausführbare Datei zum Laufen zu bringen, indem ich sie direkt von einem Nixos-Host auf einen anderen kopiere. Sie funktioniert/wird nur auf einem der Hosts ausgeführt.

Auf dem alten Host (wo es funktioniert):

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

Auf dem neuen Host wird die gemeinsam genutzte Bibliothek nicht gefunden:

[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


Ich sehe libpq.sojedoch eine Datei im Verzeichnis postgresql-lib auf dem neuen 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

Ich habe die [glibc gmp5 postgresql postgresql.lib zlib.dev zlib.out]Pakete in meinem installiert environment.systemPackages.

Antwort1

Von Nix erstellte Pakete verlassen sich normalerweise auf DT_RUNPATHEinträge in ELF-Dateien, um gemeinsam genutzte Bibliotheken zu finden. Sie können beispielsweise verwenden, nix run -f . patchelf -c patchelf --print-rpath appum die Einträge anzuzeigen. In Ihrem Fall wird etwa Folgendes zurückgegeben:

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

Da es sich hierbei um absolute Pfade handelt, müssen die entsprechenden Pfade im Nix-Store vorhanden sein, damit die Bibliotheken gefunden werden können.

Wenn Sie das nixpkgsCommit kennen, mit dem Sie das Programm erstellt haben, können Sie es nix-build -f https://github.com/NixOS/nixpkgs/archive/${commit}.tar.gz -A postgresql.libauf dem zweiten Computer ausführen, um die Bibliothek zum Store hinzuzufügen. Beachten Sie jedoch, dass es von einem Garbage Collector gelöscht werden kann, wenn Sie es nicht zum GC-Stamm hinzufügen.

Wenn Sie Ihr Programm als Nix-Ausdruck erstellt haben, ist es ziemlich einfach,Exportieren Sie den gesamten Verschlussund importieren Sie es auf einen anderen Computer.

verwandte Informationen