“Nenhum tal arquivo ou diretório” como erro para arquitetura incorreta [duplicado]

1

Estou tentando executar um compilador cruzado no meu Ubuntu de 64 bits. e resulta em um erro a seguir:

$ ./arm-none-eabi-gcc
bash: ./arm-none-eabi-gcc: No such file or directory

O arquivo está aqui e contém alguns dados:

$ ls -la arm-none-eabi-gcc
-rwxr-xr-x 2 alan alan 776368 Sep 26 19:36 arm-none-eabi-gcc
$ head -n 1 arm-none-eabi-gcc
ELFا4�
         4  (44�4�  TT�T���|�

ldd mostra que não há dependências necessárias:

$ ldd arm-none-eabi-gcc
not a dynamic executable

strace também não fornece informações adicionais:

$ strace ./arm-none-eabi-gcc
execve("./arm-none-eabi-gcc", ["./arm-none-eabi-gcc"], [/* 80 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1)                           = ?
+++ exited with 1 +++

Por fim, descubro que é para um sistema de 32 bits:

$ file arm-none-eabi-gcc
arm-none-eabi-gcc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.8, stripped

Pergunta

Se a arquitetura do binário está errada, por que o erro é tão ambíguo?

Espero que seja análogo à situação abaixo em que estou tentando executar um .JPG, em que a execução binária não faz sentido:

$ ./DSC_0140.JPG 
bash: ./DSC_0140.JPG: cannot execute binary file: Exec format error
    
por TheMeaningfulEngineer 14.12.2016 / 16:32

1 resposta

4

O erro vem do fato de que você está perdendo o carregador para o binário, /lib/ld-linux.so.2 (conforme indicado por file ). Uma vez instalado, você poderá executar ldd arm-none-eabi-gcc para ver o que é necessário além disso.

O executável está em um formato válido, que o kernel entende, então você não obtém um "erro de formato Exec", mas quando o kernel tenta executá-lo, ele não consegue encontrar um arquivo necessário - o carregador - , daí "Nenhum arquivo ou diretório".

Como você descobriu, uma solução rápida para executá-lo na máquina de 64 bits é executar:

sudo apt-get install lib32z1 lib32ncurses5

embora uma solução melhor a longo prazo é usar pacotes :i386 multiarch apropriados (o que deve ser o que é puxado por lib32 packages).

    
por 14.12.2016 / 16:35