Quando você falha em executar um arquivo que depende de um "carregador", o erro que você recebe pode se referir ao carregador e não ao arquivo que você está executando.
- O carregador de um executável nativo vinculado dinamicamente é a parte do sistema responsável pelo carregamento de bibliotecas dinâmicas. É algo como
/lib/ld.so
ou /lib/ld-linux.so.2
e deve ser um arquivo executável.
- O carregador de um script é o programa mencionado na linha shebang, por exemplo,
/bin/sh
para um script que começa com #!/bin/sh
. (Bash e zsh dão a mensagem "intérprete incorreto" em vez de "comando não encontrado" neste caso.)
A mensagem de erro é bastante enganosa ao não indicar que o carregador é o problema. Infelizmente, corrigir isso seria difícil porque a interface do kernel só tem espaço para relatar um código de erro numérico, não para também indicar que o erro de fato diz respeito a um arquivo diferente. Alguns shells fazem o trabalho eles mesmos para scripts (lendo a #!
linha no script e refazendo a condição de erro), mas nenhum que eu tenha visto tenta fazer o mesmo com os binários nativos.
ldd
também não funcionará nos binários porque funciona definindo algumas variáveis de ambiente especiais e executando o programa, permitindo que o carregador faça o trabalho. strace
também não forneceria nenhuma informação significativa, pois não reportaria mais do que o que o kernel informa e, como vimos, o kernel não pode relatar tudo o que sabe.
Essa situação geralmente ocorre quando você tenta executar um binário para o sistema certo (ou família de sistemas) e a superarquitetura, mas a subarquitetura errada. Aqui você tem binários ELF em um sistema que espera binários ELF, portanto o kernel os carrega perfeitamente. Eles são binários do i386 executados em um processador x86_64, portanto as instruções fazem sentido e levam o programa ao ponto em que ele pode procurar seu carregador. Mas o programa é um programa de 32 bits (como a file
saída indica), procurando o carregador de 32 bits /lib/ld-linux.so.2
, e você presumivelmente instalou apenas o carregador de 64 bits /lib64/ld-linux-x86-64.so.2
no chroot.
Você precisa instalar o sistema de tempo de execução de 32 bits no chroot: o carregador e todas as bibliotecas que os programas precisam. A partir do Debian wheezy em diante, se você deseja suporte para i386 e x86_64, comece com uma instalação amd64 e ative o suporte a multiarch : execute dpkg --add-architecture i386
then apt-get update
e apt-get install libc6:i386 zlib1g:i386 …
(se você deseja gerar uma lista das dependências do pacote perl do Debian, para ver quais bibliotecas provavelmente necessário, você pode usar aptitude search -F %p '~Rdepends:^perl$ ~ri386'
). Você pode obter uma coleção de bibliotecas comuns instalando o ia32-libs
pacote (primeiro é necessário ativar o suporte a multiarch). No Debian amd64 até chiado, o carregador de 32 bits está no libc6-i386
pacote. Você pode instalar um conjunto maior de bibliotecas de 32 bits instalando ia32-libs
.
libc6-i386
pacote ouia32-libs
se você deseja muitas bibliotecas).