J'ai un système hérité avec une très vieille glibc, que nous ne pouvons pas mettre à niveau sans encourir une montagne de tests / validation.
J'ai dû exécuter plusieurs fois de nouveaux programmes (tels que Java 1.7) sur ce système. J'ai opté pour une solution chroot, où je regroupe toutes les bibliothèques nécessaires et exécute un service dans un chroot.
Le chroot est cependant très limitant, et je préfère essayer de résoudre le problème avec LD_LIBRARY_PATH. Malheureusement, je reçois une erreur libc.so.6: cannot handle TLS data
lorsque j'essaye.
Il s'avère que j'ai aussi besoin /lib/ld-linux.so.2
du chroot. Cela marche:
LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program
Cependant, java
déjoue mon astuce en inspectant /proc/self/cmdline
pour déterminer d'où charger ses bibliothèques, ce qui échoue si le binaire n'a pas été nommé 'bin / java'. Java s'exécute également au démarrage, ce qui complique encore les choses.
Dans une dernière tentative pour que cela fonctionne, j'ai ouvert le binaire java avec un éditeur hexadécimal et remplacé la chaîne /lib/ld-linux.so.2
par /home/chroot/ld.so
(et en ai fait un lien symbolique ld-linux.so.2
), et cela a fonctionné!
Mais je pense que tout le monde serait d'accord pour dire que c'est une tâche énorme de réécrire le chemin de chaque nouveau binaire vers un chemin absolu du système imbriqué.
Quelqu'un connaît-il une façon plus propre d'utiliser un chemin de bibliothèque personnalisé, y compris un ld-linux.so personnalisé?
la source
patchelf --set-interpreter $JAVA/lib/ld-linux.so.2 --set-rpath $JAVA/lib:$JAVA/lib/i386:$JAVA/lib/i386/jli $JAVA/bin/java
, où $ JAVA est le répertoire du JRE, et où j'avais rassemblé toutes les bibliothèques dépendantes et les ai placées dans lelib/
répertoire du JRE.ldd $JAVA/bin/java
d'avoir le premier. Il y a aussi quelques libc dynamiques dont vous avez besoin comme libnss.so