Ambos os ficheiros são de 32 bits e apenas um deles corre na sua placa. Uma compilação ELF32 para Intel e uma compilação ELF32 para ARM concordam no campo da classe e discordam em tudo o que importa. Uma página de descarregamento que oferece uma opção de 32 bits não lhe disse quase nada até ler o cabeçalho do ficheiro que descarregou realmente. Mudar-lhe o nome não altera uma única instrução.

A classe e a máquina respondem a perguntas diferentes

O campo da classe indica se o ficheiro usa estruturas de 32 ou 64 bits. O campo da máquina nomeia o conjunto de instruções para o qual o ficheiro foi compilado. Ler apenas o primeiro é como uma compilação x86 acaba numa placa ARM com um nome de ficheiro que parece perfeitamente plausível. Ambos os valores vêm do mesmo comando, por isso é tão fácil saltar um deles.

A mesma confusão aplica-se às etiquetas de 64 bits, onde aarch64 e x86-64 partilham um tamanho de palavra e nenhuma instrução. Uma página de fornecedor que lista um único descarregamento de 64 bits descreve a sua própria compilação, não a sua máquina. Verifique o cabeçalho do ficheiro em vez do título da coluna na página.

readelf -h ./vendor-vpn
readelf -l ./vendor-vpn | head -20
file ./vendor-vpn

O primeiro comando imprime o cabeçalho, incluindo a classe e a máquina. O segundo mostra os cabeçalhos de programa, onde reside um pedido de interpretador. O terceiro dá-lhe uma linha quando uma tabela é mais do que precisa.

Adicionar permissão de execução ou corrigir uma verificação de distribuição não traduz nada. A emulação, onde a plataforma a suporta, é uma decisão de implementação com o seu próprio custo de desempenho e dependências.

Leia o cabeçalho antes de executar o instalador

Inspecione um artefacto de confiança antes de executar algo a partir dele. Um instalador que falha a meio pode deixar bibliotecas substituídas e nada a funcionar, o que é um pior ponto de partida do que o arquivo com que começou. A inspeção do cabeçalho é só de leitura e reversível no sentido em que nada muda no sistema.

Compare o campo da máquina com a arquitetura de pacotes do sistema em execução, não com o nome comercial da placa. Uma CPU de 64 bits a executar um espaço de utilizador de 32 bits precisa da compilação de 32 bits, e esse detalhe decide qual descarregamento é nativo. A capacidade da placa não é a restrição; o espaço de utilizador instalado é.

dpkg --print-architecture
uname -m
getconf LONG_BIT

O primeiro comando reporta a arquitetura para a qual o sistema instala pacotes, e é esse o valor que tem de coincidir. Os outros dois descrevem o núcleo e o tamanho da palavra, e podem divergir do espaço de utilizador numa instalação multi-arquitetura.

Quando essas respostas divergem, decida qual o fornecedor suporta antes de descarregar outro arquivo. Adivinhar produz um ciclo de instalações que falham cada uma num ponto diferente, e cada falha parece um problema novo.

Verifique o interpretador, não apenas a arquitetura

Um executável dinâmico registra o carregador que espera num cabeçalho de programa. Num sistema com um caminho de carregador diferente, o núcleo recusa iniciar o ficheiro mesmo que o campo da máquina coincida exatamente. É essa a falha que envia as pessoas à procura de bibliotecas em falta.

A mensagem de erro diz-lhe em que caso está, e os dois casos são fáceis de confundir. Uma rejeição de formato ou arquitetura difere de um ficheiro ou interpretador em falta, e só um deles se corrige instalando outro pacote.

readelf -l ./vendor-vpn | grep -A1 INTERP
ls -l /lib64/ld-linux-x86-64.so.2

O primeiro comando mostra o caminho do interpretador que o binário pede. O segundo verifica se esse caminho existe, o que separa uma compilação errada de um carregador em falta.

Não execute um listador de dependências contra um binário não fidedigno, porque algumas implementações podem executar o ficheiro que inspecionam. Mantenha a inspeção só de leitura e resista à tentação de acrescentar ligações simbólicas do carregador para pôr uma compilação não suportada a arrancar.

Peça uma compilação com os factos na mão

Envie ao fornecedor a versão do sistema operativo, a arquitetura de pacotes, os valores de classe e máquina e a primeira mensagem de erro. Essa combinação obtém uma resposta útil, enquanto uma captura de ecrã de uma falha genérica obtém um modelo de apoio.

Mantenha a questão do binário separada da questão da configuração. Uma vez que a compilação correta arranca, os perfis, as credenciais e as rotas continuam a ser problemas seus, e nenhuma edição de perfil fará um binário de arquitetura errada funcionar.

Artigos relacionados