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).