Eu tenho um sistema legado com um glibc muito antigo, que não podemos atualizar sem incorrer em uma montanha de trabalho de teste / validação.
Eu precisava executar programas mais recentes (como o Java 1.7) nesse sistema várias vezes agora. Optei por uma solução chroot, onde empacote todas as bibliotecas necessárias e execute um serviço em um chroot.
O chroot é muito limitador, e eu prefiro tentar resolver o problema com LD_LIBRARY_PATH. Infelizmente, recebo um erro libc.so.6: cannot handle TLS data
quando tento isso.
Acontece que eu preciso /lib/ld-linux.so.2
do chroot também. Isso funciona:
LD_LIBRARY_PATH=/home/chroot/lib /home/chroot/lib/ld-linux.so.2 /home/chroot/bin/program
No entanto, java
frustra meu truque inspecionando /proc/self/cmdline
para determinar de onde carregar suas bibliotecas, o que falha se o binário não tiver sido chamado de 'bin / java'. Também o java se executa durante a inicialização, complicando ainda mais as coisas.
Em uma última tentativa de fazer isso funcionar, abri o binário java com um editor hexadecimal e substituí a string /lib/ld-linux.so.2
por /home/chroot/ld.so
(e fiz disso um link simbólico ld-linux.so.2
), e funcionou!
Mas eu acho que todos concordariam que é um enorme erro reescrever o caminho de todo novo binário para um caminho absoluto do sistema aninhado.
Alguém conhece uma maneira mais limpa de usar um caminho de biblioteca personalizado, incluindo um ld-linux.so personalizado?
fonte
patchelf --set-interpreter $JAVA/lib/ld-linux.so.2 --set-rpath $JAVA/lib:$JAVA/lib/i386:$JAVA/lib/i386/jli $JAVA/bin/java
onde $ JAVA é o diretório do JRE e onde reuni todas as bibliotecas dependentes e as coloquei nolib/
diretório do JRE.ldd $JAVA/bin/java
pegar o ist. Há também alguns dinâmica libc que você precisa, como libnss.so