Java JDK manca il percorso libjli.so nell'elenco delle dipendenze, Debian


8

Sto scrivendo la creazione di jroot jail e parte di quella automazione include la copia di vari eseguibili e le loro dipendenze nella jail. Sto usando la seguente riga bash per analizzare i percorsi dei file da un elenco di dipendenze (ad esempio per Java):

$ 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

Funziona benissimo per Node.js e Python, ma quando provo ad eseguire javadall'interno del carcere, ricevo un errore:

java: errore durante il caricamento delle librerie condivise: libjli.so: impossibile aprire il file oggetto condiviso: nessun file o directory

Si scopre che il percorso libjli.so manca dall'elenco delle dipendenze ... almeno quelle che lddci mostrano (riga 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)

Ho trovato il file ...

$ 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

... ma vorrei sapere perché non è stato elencato ldd. Apparentemente è una dipendenza nota, ma il percorso è sconosciuto? Qualsiasi aiuto è apprezzato!


Domanda interessante, potresti provare a chiedere questo su un forum openjdk.
Faheem Mitha,

Nel caso in cui qualcuno si imbatti in questo da google: sembra che potrebbe essere un duplicato con unix.stackexchange.com/questions/16656 , che ha più informazioni (e risposte diverse).
yshavit,

Risposte:


7

Dovrebbe funzionare fuori dalla scatola - senza fare confusione con /etc/ld.so.conf* o ldconfig - e può facilmente farlo. Basta montare / proc nel chroot. Lo faccio con la seguente riga in / etc / fstab nel mio fs real-root:

/ proc / var / chroot / ia32 / proc nessuno vincolante

Legandolo così al reale / proc.

Per https://github.com/cedric-vincent/PRoot/issues/9 , ld-linux.so (immagino che sia) determina $ ORIGIN per la sostituzione nelle voci RPATH di objdump -p guardando / proc / self / EXE.

Quante volte sono stato morso da questo e ho dovuto riscoprirlo? Per favore, oh potente e saggio Google, riportami qui rapidamente la prossima volta, in modo che il futuro possa imparare di nuovo al ginocchio del passato!


1
Grazie. Il tuo riferimento a /proc/self/exeera l'indizio mancante al mio fianco. Montare /procnel mio chroot ha fatto il trucco.
Tino,

3

Sembra che tu debba aggiungere

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

su /etc/ld.so.conf, o più probabilmente su un nuovo file in /etc/ld.so.conf.d. Quindi eseguire ldconfigper aggiornare la cache in modo lddda trovare la libreria.

Per i chroot di script, probabilmente a lungo termine avrai meno problemi ad adottare un approccio basato su pacchetti, creando prima un'installazione di base (usando ad esempio debootstrap su host basati su Debian), quindi installando i pacchetti che desideri. Ciò consente al gestore pacchetti di occuparsi di tutto il lavoro di risoluzione delle dipendenze, installazione di tutti i file necessari ed esecuzione delle attività postinstallazione.


E puoi dirmi perché non era in ld.so.conf o in uno dei file inclusi? Il sistema operativo dovrebbe averlo messo lì durante l'installazione?
Rip Leeb,

No, non lo so. Posso dire di vedere lo stesso risultato sul mio host Ubuntu 14.04, eppure Java inizia bene. Quindi deve risolvere la dipendenza in modo dinamico in fase di esecuzione.
Andrew Schulman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.