Ho un sistema legacy con un glibc molto vecchio, che non possiamo aggiornare senza incorrere in una montagna di lavori di test / validazione.
Ho dovuto eseguire più volte nuovi programmi (come Java 1.7) su quel sistema. Ho optato per una soluzione chroot, in cui impacchettavo tutte le librerie necessarie ed eseguivo un servizio in chroot.
Il chroot è comunque molto limitante e preferirei provare a risolvere il problema con LD_LIBRARY_PATH. Sfortunatamente, ricevo un errore libc.so.6: cannot handle TLS data
quando lo provo.
Si scopre che ho bisogno anche /lib/ld-linux.so.2
del chroot. Questo funziona:
LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program
Tuttavia, java
ostacola il mio trucco ispezionando /proc/self/cmdline
per determinare da dove caricare le sue librerie, il che non riesce se il binario non è stato chiamato 'bin / java'. Anche java si esegue automaticamente all'avvio, complicando ulteriormente le cose.
In un ultimo tentativo di far funzionare questo, ho aperto il binario java con un editor esadecimale e ho sostituito la stringa /lib/ld-linux.so.2
con /home/chroot/ld.so
(e ho creato un link simbolico a ld-linux.so.2
), e ha funzionato!
Ma penso che tutti sarebbero d'accordo sul fatto che è un grosso kludge riscrivere il percorso di ogni nuovo binario in un percorso assoluto del sistema nidificato.
Qualcuno conosce un modo più pulito di utilizzare un percorso di libreria personalizzato incluso un ld-linux.so personalizzato?