Java JDK fehlt der Pfad libjli.so in der Abhängigkeitsliste, Debian

8

Ich schreibe Skripte für die Erstellung von Chroot-Gefängnissen und ein Teil dieser Automatisierung umfasst das Kopieren verschiedener ausführbarer Dateien und ihrer Abhängigkeiten in das Gefängnis. Ich verwende die folgende Bash-Zeile, um die Dateipfade aus einer Liste von Abhängigkeiten (zum Beispiel für Java) zu analysieren:

$ ldd `which java` | grep -o '/[^()]*'
/lib/x86_64-linux-gnu/libz.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/lib/x86_64-linux-gnu/libdl.so.2
/lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2

Dies funktioniert gut für Node.js und Python, aber wenn ich versuche, javaaus dem Gefängnis heraus auszuführen , erhalte ich eine Fehlermeldung:

java: Fehler beim Laden von gemeinsam genutzten Bibliotheken: libjli.so: Datei für gemeinsam genutzte Objekte kann nicht geöffnet werden: Keine solche Datei oder kein solches Verzeichnis

Es stellt sich heraus, dass der Pfad libjli.so in der Liste der Abhängigkeiten fehlt ... zumindest die, ldddie uns zeigen (Zeile 5):

$ ldd `which java`
linux-vdso.so.1 =>  (0x00007ffff7f4d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7ac3928000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7ac370c000)
libjli.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7ac3507000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ac317c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7ac3b48000)

Ich habe die Datei gefunden ...

$ find /usr/lib -name libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/lib/amd64/jli/libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli/libjli.so

... aber ich würde gerne wissen, warum es nicht mit aufgeführt ist ldd. Es ist anscheinend eine bekannte Abhängigkeit, aber der Pfad ist unbekannt? Jede Hilfe wird geschätzt!

Rip Leeb
quelle
Interessante Frage, Sie könnten versuchen, dies in einem openjdk-Forum zu stellen.
Faheem Mitha
Falls jemand von Google darauf stößt : Es scheint, als wäre es ein Duplikat mit unix.stackexchange.com/questions/16656 , das mehr Informationen (und unterschiedliche Antworten) enthält.
Yshavit

Antworten:

7

Es soll sofort funktionieren - ohne Probleme mit /etc/ld.so.conf* oder ldconfig - und es kann dies problemlos tun. Montieren Sie einfach / proc in Ihrer Chroot. Ich mache das mit der folgenden Zeile in / etc / fstab in meiner Real-Root-Fs:

/ proc / var / chroot / ia32 / proc keine Bindung

Damit binde ich es an den Real / Proc.

Per https://github.com/cedric-vincent/PRoot/issues/9 bestimmt ld-linux.so (ich denke es ist) $ ORIGIN für das Einsetzen in die RPATH-Einträge des objdump -p, indem es sich / proc / self / ansieht exe.

Wie oft wurde ich davon gebissen und musste es wieder entdecken? Bitte, oh mächtiger und weiser Google, führe mich das nächste Mal schnell hierher zurück, damit die Zukunft - ich kann wieder am Knie meiner Vergangenheit lernen!

Martin Dorey
quelle
1
Vielen Dank. Ihr Hinweis auf /proc/self/exewar der fehlende Hinweis an meiner Seite. Die Montage /procin meiner Chroot hat es geschafft.
Tino
3

Es scheint, dass Sie hinzufügen müssen

/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli

zu /etc/ld.so.conf oder eher zu einer neuen Datei in /etc/ld.so.conf.d. Führen Sie dann aus ldconfig, um den Cache zu aktualisieren, damit ldddie Bibliothek gefunden wird.

Bei Scripting-Chroots werden Sie auf lange Sicht wahrscheinlich weniger Probleme haben, einen paketbasierten Ansatz zu wählen, indem Sie zuerst eine Basisinstallation erstellen (z. B. mit debootstrap auf Debian-basierten Hosts) und dann die gewünschten Pakete installieren. Auf diese Weise erledigt der Paketmanager die gesamte Arbeit zum Auflösen von Abhängigkeiten, zum Installieren aller erforderlichen Dateien und zum Ausführen von Aufgaben nach der Installation.

Andrew Schulman
quelle
Und können Sie mir sagen, warum es nicht in ld.so.conf oder einer der enthaltenen Dateien war? Sollte das Betriebssystem es während der Installation dort abgelegt haben?
Rip Leeb
Nein, das weiß ich nicht. Ich kann sagen, dass ich auf meinem Ubuntu 14.04-Host das gleiche Ergebnis sehe und Java trotzdem gut startet. Daher muss die Abhängigkeit zur Laufzeit dynamisch aufgelöst werden.
Andrew Schulman