Ich habe ein Altsystem mit einer sehr alten Glibc, die wir nicht aktualisieren können, ohne einen Berg von Test- / Validierungsarbeiten zu verursachen.
Ich musste jetzt mehrmals neuere Programme (wie Java 1.7) auf diesem System ausführen. Ich habe mich für eine Chroot-Lösung entschieden, bei der ich alle benötigten Bibliotheken gepackt und einen Dienst in einer Chroot ausgeführt habe.
Die Chroot ist jedoch sehr einschränkend, und ich würde lieber versuchen, das Problem mit LD_LIBRARY_PATH zu lösen. Leider erhalte ich eine Fehlermeldung, libc.so.6: cannot handle TLS data
wenn ich das versuche.
Es stellt sich heraus, dass ich das auch /lib/ld-linux.so.2
von der Chroot brauche . Das funktioniert:
LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program
Dies java
vereitelt jedoch meinen Trick, indem untersucht wird /proc/self/cmdline
, woher die Bibliotheken geladen werden sollen. Dies schlägt fehl, wenn die Binärdatei nicht den Namen 'bin / java' trägt. Auch Java führt sich beim Start von selbst aus, was die Sache noch komplizierter macht.
In einem letzten Versuch, dies zum Laufen zu bringen, öffnete ich die Java-Binärdatei mit einem Hex-Editor und ersetzte die Zeichenfolge /lib/ld-linux.so.2
durch /home/chroot/ld.so
(und machte daraus einen Symlink zu ld-linux.so.2
), und es funktionierte!
Aber ich denke, jeder würde zustimmen, dass es ein riesiger Aufwand ist, den Pfad jeder neuen Binärdatei in einen absoluten Pfad des verschachtelten Systems umzuschreiben.
Kennt jemand eine sauberere Möglichkeit, einen benutzerdefinierten Bibliothekspfad einschließlich einer benutzerdefinierten ld-linux.so zu verwenden?
quelle
patchelf --set-interpreter $JAVA/lib/ld-linux.so.2 --set-rpath $JAVA/lib:$JAVA/lib/i386:$JAVA/lib/i386/jli $JAVA/bin/java
, wobei $ JAVA das Verzeichnis der JRE ist und ich alle abhängigen Bibliotheken aufgerundet und in daslib/
Verzeichnis der JRE gestellt hatte.ldd $JAVA/bin/java
bekommen. Es gibt auch einige dynamische libc, die Sie brauchen, wie libnss.so