Usando libc alternativa com ld-linux.so hacks; método mais limpo?

12

Eu tenho um sistema legado com um glibc muito antigo, que não podemos atualizar sem incorrer em uma montanha de testes / validação.

Eu precisei executar programas mais recentes (como o Java 1.7) nesse sistema várias vezes agora. Eu optei por uma solução chroot, onde empacotei todas as bibliotecas necessárias e executei um serviço em um chroot.

O chroot é muito limitado, e eu prefiro tentar resolver o problema com o LD_LIBRARY_PATH. Infelizmente, recebo um erro sobre libc.so.6: cannot handle TLS data quando tento isso.

Acontece que eu preciso do /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 anula meu truque inspecionando /proc/self/cmdline para determinar de onde carregar suas bibliotecas, o que falha se o binário não tiver o nome 'bin / java'. Também o próprio java execs durante a inicialização, complicando ainda mais as coisas.

Em uma tentativa desesperada de fazer esse trabalho, eu abri o binário java com um editor hexadecimal e substituí a string /lib/ld-linux.so.2 com /home/chroot/ld.so (e tornei isso um link simbólico para ld-linux.so.2 ), e funcionou!

Mas acho que todos concordariam que é um kludge massivo reescrever o caminho de cada novo binário para um caminho absoluto do sistema aninhado.

Alguém sabe uma maneira mais clara de usar um caminho de biblioteca personalizado incluindo um ld-linux.so?

personalizado?     
por dataless 02.04.2014 / 03:30

1 resposta

9

O caminho para o carregador é compilado no binário como você descobriu com o editor hexadecimal. Você realmente teve sorte que a edição do binário funcionou diretamente, porque /lib/ld-linux.so.2 e /home/chroot/ld.so têm o mesmo comprimento. Os comprimentos dessas strings também estão no binário e você pode causar problemas sutis se modificar as strings diretamente.

Se você acabar seguindo o caminho, deve dar uma olhada em algo como patchelf para atualizar o intérprete. Isso permitiria que você alterasse permanentemente o intérprete com rapidez e segurança.

    
por 04.04.2014 / 22:55