Java JDK ausente no caminho libjli.so na lista de dependências, Debian

8

Estou criando scripts para a criação de cadeias de chroot e parte dessa automação inclui copiar vários executáveis ​​e suas dependências para a prisão. Estou usando a seguinte linha de bash para analisar os caminhos de arquivo 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 Node.js e Python, mas quando tento executar javade dentro da prisão, recebo um erro:

java: erro ao carregar bibliotecas compartilhadas: libjli.so: não é possível abrir o arquivo de objeto compartilhado: Não existe esse arquivo ou diretório

Acontece que o caminho libjli.so está ausente na lista de dependências ... pelo menos aqueles que lddnos mostram (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)

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 ldd. Aparentemente, é uma dependência conhecida, mas o caminho é desconhecido? Qualquer ajuda é apreciada!

Rip Leeb
fonte
Pergunta interessante, você pode tentar fazer isso em um fórum openjdk.
Faheem Mitha 6/11
Caso alguém se depare com isso no google: parece que pode ser uma duplicata em unix.stackexchange.com/questions/16656 , que possui mais informações (e respostas diferentes).
yshavit

Respostas:

7

Ele deve funcionar imediatamente - sem mexer com /etc/ld.so.conf* ou ldconfig - e pode ser feito facilmente. Basta montar / proc no seu chroot. Eu faço isso com a seguinte linha no / etc / fstab no meu real-root fs:

/ proc / var / chroot / ia32 / proc none bind

Assim, vinculando-o ao real / proc.

Por https://github.com/cedric-vincent/PRoot/issues/9 , ld-linux.so (eu acho que é) determina $ ORIGIN para substituir nas entradas RPATH do objdump -p, olhando para / proc / self / Exe.

Quantas vezes fui mordido por isso e tive que redescobri-lo? Por favor, ó poderoso e sábio Google, leve-me de volta para cá rapidamente da próxima vez, para que o futuro possa aprender de novo no joelho do passado!

Martin Dorey
fonte
1
Obrigado. Você apontou /proc/self/exefoi a pista que faltava ao meu lado. Montar /procno meu chroot fez o truque.
Tino
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 ldconfiga atualização do cache para lddencontrar a biblioteca.

Para chroots de script, você provavelmente terá menos dificuldades a longo prazo para adotar uma abordagem baseada em pacotes, criando uma instalação básica primeiro (usando, por exemplo, debootstrap em hosts baseados no Debian) e depois instalando os pacotes que você deseja. Isso permite que o gerenciador de pacotes cuide de todo o trabalho de resolução de dependências, instalação de todos os arquivos necessários e execução de tarefas pós-instalação.

Andrew Schulman
fonte
E você pode me dizer por que não estava no ld.so.conf ou em um dos arquivos incluídos? O sistema operacional deve colocá-lo lá durante a instalação?
Rip Leeb
Não sei disso. Posso dizer que vejo o mesmo resultado no meu host Ubuntu 14.04, e mesmo assim o java começa bem. Portanto, ele deve resolver a dependência dinamicamente no tempo de execução.
Andrew Schulman