Java JDK faltando o caminho libjli.so na lista de dependências, Debian

7

Estou criando scripts para a criação de jail chroot e parte dessa automação inclui a cópia de vários executáveis e suas dependências na cadeia. Eu estou usando a seguinte linha bash para analisar os caminhos de arquivo fora de uma lista de dependências (para java, por exemplo):

$ ldd 'which java' | grep -o '/[^()]*'
/lib/x86_64-linux-gnu/libz.so.1
/lib/x86_64-linux-gnu/libpthread.so.0
/lib/x86_64-linux-gnu/libdl.so.2
/lib/x86_64-linux-gnu/libc.so.6
/lib64/ld-linux-x86-64.so.2

Isso funciona muito bem para o Node.js e o Python, mas quando tento executar java de dentro da cadeia, recebo um erro:

java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory

Acontece que o caminho libjli.so está faltando na lista de dependências ... pelo menos aquelas que ldd nos mostra (linha 5):

$ ldd 'which java'
linux-vdso.so.1 =>  (0x00007ffff7f4d000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7ac3928000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f7ac370c000)
libjli.so => not found
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7ac3507000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7ac317c000)
/lib64/ld-linux-x86-64.so.2 (0x00007f7ac3b48000)

Eu encontrei o arquivo ...

$ find /usr/lib -name libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/lib/amd64/jli/libjli.so
/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli/libjli.so

... mas gostaria de saber por que não foi listado com ldd . É uma dependência conhecida aparentemente, mas o caminho é desconhecido? Qualquer ajuda é apreciada!

    
por Rip Leeb 30.10.2014 / 00:42

2 respostas

7

Ele deve funcionar fora da caixa - sem mexer com /etc/ld.so.conf* ou ldconfig - e pode facilmente fazê-lo. Apenas monte / proc no seu chroot. Eu faço isso com a seguinte linha em / etc / fstab no meu fs de raiz real:

/ proc / var / chroot / ia32 / proc nenhum vincular

Ligando-o assim ao real / proc.

Por link , ld-linux.so (eu acho que é) determina $ ORIGIN para substituir nas entradas RPATH do objdump -p, olhando para / proc / self / exe.

Quantas vezes eu fui mordido por isso e tive que redescobri-lo? Por favor, oh poderoso e sábio Google, me conduza de volta aqui rapidamente da próxima vez, então o futuro de mim pode aprender de novo no joelho do meu passado!

    
por 30.01.2015 / 08:59
3

Parece que você precisa adicionar

/usr/lib/jvm/java-6-openjdk-amd64/jre/lib/amd64/jli

para /etc/ld.so.conf, ou mais provável para um novo arquivo em /etc/ld.so.conf.d. Em seguida, execute ldconfig para atualizar o cache, então ldd encontrará a biblioteca.

Para chroots de script, você provavelmente terá menos dificuldade em adotar uma abordagem baseada em pacotes, criando uma instalação básica primeiro (usando, por exemplo, debootstrap em hosts baseados em Debian) e instalando os pacotes desejados. Isso permite que o gerenciador de pacotes cuide de todo o trabalho de resolver dependências, instalar todos os arquivos necessários e executar tarefas pós-instalação.

    
por 30.10.2014 / 08:59