Tengo un sistema heredado con un glibc muy antiguo, que no podemos actualizar sin incurrir en una montaña de trabajo de prueba / validación.
He necesitado ejecutar programas más nuevos (como Java 1.7) en ese sistema varias veces ahora. Opté por una solución chroot, donde empaqueto todas las bibliotecas necesarias y ejecuto un servicio en un chroot.
Sin embargo, el chroot es muy limitante, y prefiero tratar de resolver el problema con LD_LIBRARY_PATH. Desafortunadamente, recibo un error libc.so.6: cannot handle TLS data
cuando intento eso.
Resulta que también necesito /lib/ld-linux.so.2
el chroot. Esto funciona:
LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program
Sin embargo, java
frustra mi truco al inspeccionar /proc/self/cmdline
para determinar dónde cargar sus bibliotecas, lo que falla si el binario no se llamaba 'bin / java'. También Java se ejecuta durante el inicio, lo que complica aún más las cosas.
En un último intento para hacer que esto funcione, abrí el binario java con un editor hexadecimal y reemplacé la cadena /lib/ld-linux.so.2
con /home/chroot/ld.so
(y lo convertí en un enlace simbólico ld-linux.so.2
), ¡y funcionó!
Pero creo que todos estarían de acuerdo en que es un error enorme reescribir la ruta de cada nuevo binario a una ruta absoluta del sistema anidado.
¿Alguien conoce una forma más limpia de usar una ruta de biblioteca personalizada que incluya un ld-linux.so personalizado?
fuente
patchelf --set-interpreter $JAVA/lib/ld-linux.so.2 --set-rpath $JAVA/lib:$JAVA/lib/i386:$JAVA/lib/i386/jli $JAVA/bin/java
, donde $ JAVA es el directorio del JRE, y donde había redondeado todas las bibliotecas dependientes y las había colocado en ellib/
directorio del JRE.ldd $JAVA/bin/java
obtener el ist. También hay algunos libc dinámicos que necesita, como libnss.so