bash: ./program: impossible d'exécuter un fichier binaire: erreur de format d'exécution

92

J'essaie de lancer un programme, mais une erreur se produit comme ceci:

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

Le résultat de file programétait:

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

Comment puis-je réparer cette erreur?

J'utilise Ubuntu 14.04.2 (amd64) avec VMware. J'ai également essayé avec Ubuntu i386, mais le résultat était identique.

Soongeun Hwang
la source
4
C’est un exécutable ARM, c’est-à-dire que vous avez téléchargé le mauvais format d’exécutable ou que vous avez compilé pour la mauvaise plate-forme. Vous devez obtenir le bon exécutable ou recompiler.
Karl Richter

Réponses:

78

Vous essayez d'exécuter un exécutable compilé pour une architecture ARM sur une architecture x86-64, ce qui revient à demander à votre processeur qui ne parle que l'anglais de suivre les instructions en chinois.

Si vous avez besoin d'exécuter cet exécutable, vous avez deux choix:

  1. Obtenez une version x86-64 de l'exécutable (par n'importe quel moyen; si vous ne parvenez pas à obtenir une version x86-64 de l'exécutable mais que vous pouvez obtenir son code source, vous pouvez essayer de le recompiler sur la machine virtuelle. )

  2. Installez Ubuntu Server for ARM à la place d’Ubuntu 14.04.2 (amd64). Cela nécessite soit une machine physique s'exécutant sur une architecture ARM, soit un logiciel de virtualisation capable de l'émuler.

kos
la source
23

Cela peut également se produire si vous essayez d'exécuter un exécutable x86-64 sur une plate-forme 32 bits.

Dans un cas particulier, j'ai téléchargé Visual Studio Code et essayé de l'exécuter sur mon installation Ubuntu, mais je n'avais pas réalisé que j'avais installé Ubuntu 32 bits dans cette machine virtuelle. J'ai eu cette erreur, mais après avoir téléchargé la version 32 bits, elle s'est déroulée sans problème.

Hughie Coles
la source
8

Il est souvent possible d'exécuter une image exécutable ARM sur un système amd64 si vous installez les packages binfmt-supportInstaller binfmt-support , qemuInstaller qemu et qemu-user-staticInstaller qemu-user-static :

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

qemuexécutera ensuite l’émulation syscall lorsque vous exécuterez l’exécutable. Cela fonctionne pour la plupart des fichiers binaires ARM, mais quelques-uns risquent de ne pas s'exécuter correctement.

Nathan Osman
la source
sudo apt-get installe binfmt-support qemu qemu-user-statique
Momin Al Aziz
7

Une telle erreur peut se produire si toutes les conditions suivantes sont vraies:

  • L'exécutable n'est pas un fichier mais un lien
  • Vous l'exécutez dans la VM
  • Le fichier se trouve dans le dossier partagé
  • Votre hôte est Windows.

Si vous avez ce fichier, par exemple dans une archive - essayez de le décompresser dans la VM, dans un répertoire du lecteur virtuel, et non dans un dossier mappé sur le disque dur de votre ordinateur hôte, par exemple. /myNewDir/

Pavel
la source
C'est très utile. Pour moi, j'ai créé un raccourci (lien) vers ce fichier exécutable, puis l'exécution du raccourci m'a donné l'erreur.
Duc Tran
2

Vous devez compiler votre fichier en utilisant une architecture de processeur appropriée (x86 par exemple) et copier le fichier .exe sur votre machine Linux. Ensuite, vous pouvez installer mono sur votre machine Linux et lancer la commande suivante:

mono myprogram.exe
utilisateur3578181
la source
2

Si plusieurs javasont installés sur le système, cela peut se produire et ne pas être défini par défaut. Sur Ubuntu14.04 LTS, je pouvais le résoudre en exécutant ce qui suit et en choisissant celui dont javaj'avais besoin.

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

Je choisis 2 et définir openjdk-8par défaut. Ce qui n'a pas montré le Exec format error.

lambzee
la source
0

Cela peut également arriver si le binaire utilise une implémentation libc qui n'est pas libc, telle que musl. De nos jours, ce problème spécifique est probablement rencontré lorsque vous essayez d'exécuter un fichier binaire avec libc dans un conteneur Docker avec une image basée sur alpine. Il n'y a rien qui puisse être fait au binaire lui-même pour supporter les deux environnements, parce que l'implémentation de la libc doit toujours être liée statiquement, c'est-à-dire construite directement dans le binaire, pour des raisons.

Zyl
la source