“Nenhum tal arquivo ou diretório” está em binários instalados pelo Optware

6

Eu tenho usado o Optware para instalar pacotes no meu NAS baseado em ARM por um tempo - coisas comuns como Transmissão, Samba e outros. No entanto, eu estava tendo problemas com a transmissão pendente não muito tempo depois de iniciar. Eu procurei por uma solução por algum tempo e finalmente descobri que o feed Optware que eu estava usando não era o que havia sido configurado para minha caixa NAS. Troquei os feeds e reinstalei todos os pacotes, mas agora estou recebendo o seguinte erro ao tentar executar qualquer coisa que tenha sido reinstalada:

$ smbd
-bash: /opt/sbin/smbd: No such file or directory
$ transmission-daemon
-bash: /opt/bin/transmission-daemon: No such file or directory
$ unrar
-bash: /opt/bin/unrar: No such file or directory

Eu verifiquei /opt/bin e /opt/sbin e os executáveis estão definitivamente lá - então, qual é o problema real?

$ ldd /opt/bin/transmission-daemon
/usr/bin/ldd: line 116: /opt/bin/transmission-daemon: No such file or directory

$ file /opt/bin/transmission-daemon
/opt/bin/transmission-daemon: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), stripped

$ readelf - l /opt/sbin/smbd
readelf: error while loading shared libraries: libc.so.0: cannot open shared object file: No such file or directory

$ cat /proc/$$/maps
…
40084000-4019e000 r-xp 00000000 09:01 112594 /lib/libc-2.7.so
…

Não tenho certeza do que isso significa, mas prova que o arquivo é , certo? Ou isso é algo a ver com as bibliotecas compartilhadas?

    
por Andy E 10.04.2011 / 11:47

1 resposta

6

Quando você não consegue executar um arquivo que depende de um "carregador", o erro que você recebe pode se referir ao carregador, em vez do 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 ex. /bin/sh para um script que começa com #!/bin/sh .

A mensagem de erro é bastante enganadora, não indicando que o carregador seja o problema. Infelizmente, consertar 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 indicar também que o erro de fato diz respeito a um arquivo diferente. Algumas shells fazem o trabalho para scripts (lendo a linha #! no script e refazendo a condição de erro), mas nenhuma que eu tenha visto tenta fazer o mesmo com binários nativos.

ldd não está funcionando nos binários porque funciona definindo algumas variáveis de ambiente especiais e executando o programa, deixando o carregador fazer o trabalho. strace também não forneceria nenhuma informação significativa, já que ela não reportaria mais do que o kernel reporta, e como vimos, o kernel não pode relatar tudo o que sabe.

Aqui seus executáveis reinstalados ( smbd , transmission-daemon , etc) estão solicitando um carregador que não está presente em seu sistema. Portanto, o seu novo feed também não é adequado para o seu sistema.

Essa situação geralmente surge quando você tenta executar um binário para o sistema correto (ou família de sistemas) e uma arquitetura, mas a subarquitetura errada. Aqui você tem binários ELF em um sistema que espera binários ELF, então o kernel os carrega muito bem. Eles são binários ARM em execução em um processador ARM, portanto, as instruções fazem sentido e levam o programa ao ponto em que ele pode procurar por seu carregador. Mas é o carregador errado.

Agora estou me intrometendo, mas suspeito que seu novo feed seja para o ARM errado ABI . A ABI é a linguagem comum para fazer chamadas entre procedimentos e, em particular, para chamar funções de biblioteca. Em algumas arquiteturas de processador, existem várias opções possíveis de ABI, e você precisa escolher uma e usá-la consistentemente. Existem duas ABIs da ARM com distribuições Linux: o tradicional arm-elf ABI, e o mais recente EABI ( arm-eabi ) . Você não pode misturar ABIs no mesmo sistema, então você precisa encontrar uma fonte de pacotes para sua ABI (ou reinstalar seu sistema para uma ABI diferente).

    
por 10.04.2011 / 13:09