Java JDK falta la ruta libjli.so en la lista de dependencias, Debian

8

Estoy escribiendo la creación de cárceles chroot y parte de esa automatización incluye copiar varios ejecutables y sus dependencias en la cárcel. Estoy usando la siguiente línea bash para analizar las rutas de archivo de una lista de dependencias (para Java, por ejemplo):

$ 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

Esto funciona muy bien para Node.js y Python, pero cuando intento ejecutar javadesde la cárcel, aparece un error:

java: error al cargar bibliotecas compartidas: libjli.so: no se puede abrir el archivo de objeto compartido: No existe tal archivo o directorio

Resulta que la ruta libjli.so falta en la lista de dependencias ... al menos las que lddnos muestran (línea 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)

Encontré el archivo ...

$ 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

... pero me gustaría saber por qué no figura en la lista ldd. Es aparentemente una dependencia conocida, pero la ruta es desconocida? Cualquier ayuda es apreciada!

Rip Leeb
fuente
Pregunta interesante, podría intentar preguntar esto en un foro openjdk.
Faheem Mitha
En caso de que alguien tropiece con esto desde google: parece que puede ser un duplicado con unix.stackexchange.com/questions/16656 , que tiene más información (y diferentes respuestas).
yshavit

Respuestas:

7

Se supone que funciona de inmediato, sin alterar /etc/ld.so.conf* o ldconfig, y puede hacerlo fácilmente. Simplemente monte / proc en su chroot. Hago esto con la siguiente línea en / etc / fstab en mi raíz real fs:

/ proc / var / chroot / ia32 / proc none bind

Por lo tanto, vincularlo al real / proc.

Según https://github.com/cedric-vincent/PRoot/issues/9 , ld-linux.so (supongo que lo es) determina $ ORIGIN para sustituir en las entradas RPATH de objdump -p mirando / proc / self / exe.

¿Cuántas veces he sido mordido por esto y tuve que redescubrirlo? ¡Por favor, oh poderoso y sabio Google, llévame aquí rápidamente la próxima vez, para que el futuro pueda aprender de nuevo a la altura del pasado!

Martin Dorey
fuente
1
Gracias. Su señalamiento /proc/self/exefue la pista faltante a mi lado. Montar /procen mi chroot hizo el truco.
Tino
3

Parece que necesitas agregar

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

a /etc/ld.so.conf, o más probablemente a un nuevo archivo en /etc/ld.so.conf.d. Luego ejecute ldconfigpara actualizar el caché para lddque encuentre la biblioteca.

Para los chroots de secuencias de comandos, probablemente tendrá menos dolor a largo plazo para adoptar un enfoque basado en paquetes, creando primero una instalación base (utilizando, por ejemplo, debootstrap en hosts basados ​​en Debian), y luego instalando los paquetes que desee. Eso permite que el administrador de paquetes se encargue de todo el trabajo de resolver dependencias, instalar todos los archivos necesarios y ejecutar tareas posteriores a la instalación.

Andrew Schulman
fuente
¿Y puede decirme por qué no estaba en ld.so.conf o en uno de los archivos incluidos? ¿El sistema operativo debería haberlo puesto allí durante la instalación?
Rip Leeb
No, no lo se. Puedo decir que veo el mismo resultado en mi host Ubuntu 14.04 y, sin embargo, Java comienza bien. Por lo tanto, debe resolver la dependencia dinámicamente en tiempo de ejecución.
Andrew Schulman