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 java
de 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 ldd
nos 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!
fonte
Respostas:
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!
fonte
/proc/self/exe
foi a pista que faltava ao meu lado. Montar/proc
no meu chroot fez o truque.Parece que você precisa adicionar
para /etc/ld.so.conf ou mais provável para um novo arquivo em /etc/ld.so.conf.d. Em seguida, execute
ldconfig
a atualização do cache paraldd
encontrar 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.
fonte