bash: ./program: no se puede ejecutar el archivo binario: error de formato Exec

92

Estoy tratando de ejecutar un programa, pero ocurre un error como este:

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

El resultado de file programfue:

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

¿Cómo puedo solucionar este error?

Estoy usando Ubuntu 14.04.2 (amd64) con VMware. También probé con Ubuntu i386, pero el resultado fue el mismo.

Soongeun Hwang
fuente
44
Es un ejecutable ARM, es decir, descargó el formato ejecutable incorrecto o compiló para la plataforma incorrecta. Tiene que obtener el ejecutable correcto o volver a compilar.
Karl Richter

Respuestas:

77

Está intentando ejecutar un ejecutable compilado para una arquitectura ARM en una arquitectura x86-64, que es muy similar a pedirle a su procesador que solo habla inglés que tome instrucciones en chino.

Si necesita ejecutar ese ejecutable, tiene dos opciones:

  1. Obtenga una versión x86-64 del ejecutable (por cualquier medio; si no puede obtener una versión x86-64 del ejecutable pero puede obtener su código fuente, puede intentar recompilarlo en la máquina virtual );

  2. Instale Ubuntu Server para ARM en lugar de Ubuntu 14.04.2 (amd64). Esto requiere una máquina física que se ejecute en una arquitectura ARM o un software de virtualización que pueda emularlo.

kos
fuente
23

Esto también puede ocurrir si intenta ejecutar un ejecutable x86-64 en una plataforma de 32 bits.

En una instancia específica, descargué Visual Studio Code e intenté ejecutarlo en mi instalación de Ubuntu, pero no me había dado cuenta de que había instalado Ubuntu de 32 bits en esta VM. Recibí este error, pero después de descargar la versión de 32 bits, se ejecutó sin problemas.

Hughie Coles
fuente
8

A menudo es posible ejecutar una imagen ejecutable ARM en un sistema amd64 si instala los paquetes binfmt-supportInstalar binfmt-support , qemuInstalar qemu y qemu-user-staticInstalar qemu-user-static :

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

qemuluego realizará la emulación syscall cuando ejecute el ejecutable. Esto funciona para la mayoría de los archivos binarios ARM, pero hay algunos que pueden no ejecutarse correctamente.

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

Tal error puede ocurrir si se cumple todo lo siguiente:

  • El ejecutable no es un archivo sino un enlace
  • Lo ejecutas, lo ejecutas dentro de VM
  • El archivo se encuentra en la carpeta compartida
  • Tu anfitrión es Windows.

Si obtuvo ese archivo, digamos, en el archivo, intente descomprimirlo dentro de VM, en algún directorio dentro de la unidad virtual, no en la carpeta asignada al disco duro de su máquina host, por ejemplo /myNewDir/

Pavel
fuente
Eso es muy útil. Para mí, creé un acceso directo (enlace) a ese archivo ejecutable, luego ejecutar el acceso directo me dio el error.
Duc Tran
2

Debe compilar su archivo utilizando una arquitectura de CPU adecuada (x86, por ejemplo) y copiar el archivo .exe en su máquina Linux. Luego puede instalar mono en su máquina Linux y emitir el siguiente comando:

mono myprogram.exe
usuario3578181
fuente
2

Si hay más de uno javainstalado en el sistema, esto podría suceder y no establecerse como predeterminado. En Ubuntu14.04 LTS pude resolverlo ejecutando el siguiente y eligiendo el javaque necesitaba.

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

Elijo 2 y lo configuro openjdk-8como predeterminado. Lo cual no mostró el Exec format error.

lambzee
fuente
0

Esto también puede suceder si el binario usa una implementación libc que no es libc, como musl. En la actualidad, este problema específico es más probable cuando se intenta ejecutar un archivo binario con libc en un contenedor Docker con una imagen basada en alpine. No se puede hacer nada en el binario en sí para admitir ambos entornos, porque la implementación de libc siempre debe estar vinculada estáticamente, es decir, integrada directamente en el binario, por razones.

Zyl
fuente