bash: ./program: não é possível executar o arquivo binário: erro de formato Exec

92

Estou tentando executar um programa, mas ocorre um erro assim:

bash: ./program: cannot execute binary file: Exec format error

O resultado file programfoi:

program: ELF-32-bit LSB executable, ARM, EABI4 version 1 (SYSV), dynamically linked(uses share libs), for GNU/LINUX 2.6.16, not stripped

Como posso corrigir este erro?

Estou usando o Ubuntu 14.04.2 (amd64) com o VMware. Eu também tentei com o Ubuntu i386, mas o resultado foi o mesmo.

Soongeun Hwang
fonte
4
É um executável ARM, ou seja, você baixou o formato executável errado ou compilou para a plataforma errada. Você precisa obter o executável certo ou recompilar.
21915 Karl Richter

Respostas:

77

Você está tentando executar um executável compilado para uma arquitetura ARM em uma arquitetura x86-64, que é como pedir ao seu processador que só fala inglês para tomar instruções em chinês.

Se você precisar executar esse executável, terá duas opções:

  1. Obtenha uma versão x86-64 do executável (de qualquer forma; se você não conseguir obter uma versão x86-64 do executável, mas conseguir o código fonte, tente recompilar na máquina virtual );

  2. Instale o Ubuntu Server for ARM no lugar do Ubuntu 14.04.2 (amd64). Isso requer uma máquina física executando em uma arquitetura ARM ou um software de virtualização que possa emulá-la.

kos
fonte
23

Isso também pode ocorrer se você tentar executar um executável x86-64 em uma plataforma de 32 bits.

Em uma instância específica, baixei o Visual Studio Code e tentei executá-lo na instalação do Ubuntu, mas não havia percebido que havia instalado o Ubuntu de 32 bits nesta VM. Eu recebi esse erro, mas depois de baixar a versão de 32 bits, ela foi executada sem problemas.

Hughie Coles
fonte
8

Geralmente, é possível executar uma imagem executável do ARM em um sistema amd64 se você instalar os pacotes binfmt-supportInstale o suporte binfmt , qemuInstalar qemu e qemu-user-staticInstale qemu-user-static :

sudo apt install binfmt-support qemu qemu-user-static

qemuexecutará a emulação syscall quando você executar o executável. Isso funciona para a maioria dos binários do ARM, mas existem alguns que podem não funcionar corretamente.

Nathan Osman
fonte
sudo apt-get install binfmt-support qemu qemu-user-static
Momin Al Aziz
7

Esse erro pode ocorrer se todas as seguintes opções forem verdadeiras:

  • Executável não é um arquivo, mas um link
  • Você executa, executa-o dentro da VM
  • O arquivo está localizado na pasta compartilhada
  • Seu host é o Windows.

Se você obteve esse arquivo, digamos, no arquivo morto - tente descompactá-lo na VM, em algum diretório da unidade virtual, não na pasta mapeada para o disco rígido da máquina host, por exemplo /myNewDir/

Pavel
fonte
Isso é bastante útil. Para mim, criei um atalho (link) para esse arquivo executável e, em seguida, executar o atalho me deu o erro.
Duc Tran
2

Você deve compilar seu arquivo usando uma arquitetura de CPU apropriada (x86 por exemplo) e copiar o arquivo .exe em sua máquina Linux. Em seguida, você pode instalar o mono em sua máquina Linux e emitir o seguinte comando:

mono myprogram.exe
user3578181
fonte
2

Se mais de um javaestiver instalado no sistema, isso pode ocorrer e não ser definido como padrão. No Ubuntu14.04 LTS eu conseguia resolver o problema executando o seguinte e escolhendo o que javaeu precisava.

sudo update-alternatives --config java
[sudo] password for user: 
update-alternatives: warning: /etc/alternatives/java has been changed (manually or by a script); switching to manual updates only
There are 2 choices for the alternative java (providing /usr/bin/java).

  Selection    Path                                            Priority   Status
------------------------------------------------------------
  0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      auto mode
  1            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      manual mode
  2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1069      manual mode

Press enter to keep the current choice[*], or type selection number: 2
update-alternatives: using /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java to provide /usr/bin/java (java) in manual mode

Eu escolho 2 e defino openjdk-8como padrão. O que não mostrou o Exec format error.

lambzee
fonte
0

Isso também pode acontecer se o binário usar uma implementação libc que não seja libc, como musl. Hoje em dia, é mais provável que esse problema específico seja encontrado ao tentar executar um binário com libc em um contêiner do Docker com uma imagem baseada em alpino. Não há nada que possa ser feito no próprio binário para suportar os dois ambientes, porque a implementação da libc sempre deve ser vinculada estaticamente, ou seja, embutida diretamente no binário, por razões.

Zyl
fonte