Bash: ./Programm: Binärdatei kann nicht ausgeführt werden: Fehler beim Ausführen des Formats

92

Ich versuche ein Programm auszuführen, aber ein Fehler tritt folgendermaßen auf:

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

Das Ergebnis von file programwar:

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

Wie kann ich diesen Fehler beheben?

Ich verwende Ubuntu 14.04.2 (amd64) mit VMware. Ich habe es auch mit Ubuntu i386 versucht, aber das Ergebnis war dasselbe.

Soongeun Hwang
quelle
4
Es ist eine ausführbare ARM-Datei, dh Sie haben das falsche ausführbare Format heruntergeladen oder es wurde für die falsche Plattform kompiliert. Sie müssen die richtige ausführbare Datei herunterladen oder neu kompilieren.
Karl Richter,

Antworten:

77

Sie versuchen, eine für eine ARM-Architektur kompilierte ausführbare Datei auf einer x86-64-Architektur auszuführen, ähnlich wie Sie Ihren Prozessor, der nur Englisch spricht, um Anweisungen auf Chinesisch zu bitten.

Wenn Sie diese ausführbare Datei ausführen müssen, haben Sie zwei Möglichkeiten:

  1. Erhalten Sie eine x86-64-Version der ausführbaren Datei (auf jeden Fall: Wenn Sie keine x86-64-Version der ausführbaren Datei erhalten, aber den Quellcode erhalten können, können Sie versuchen, sie auf der virtuellen Maschine erneut zu kompilieren );

  2. Installieren Sie Ubuntu Server for ARM anstelle von Ubuntu 14.04.2 (amd64). Dies erfordert entweder eine physische Maschine, die auf einer ARM-Architektur ausgeführt wird, oder eine Virtualisierungssoftware, die diese emulieren kann.

kos
quelle
23

Dies kann auch auftreten, wenn Sie versuchen, eine x86-64-Programmdatei auf einer 32-Bit-Plattform auszuführen.

In einem bestimmten Fall habe ich Visual Studio Code heruntergeladen und versucht, es auf meiner Ubuntu-Installation auszuführen, aber ich hatte nicht bemerkt, dass ich 32-Bit-Ubuntu auf dieser VM installiert hatte. Ich habe diesen Fehler erhalten, aber nach dem Herunterladen der 32-Bit-Version lief er ohne Probleme.

Hughie Coles
quelle
8

Es ist häufig möglich, ein ausführbares ARM-Image auf einem amd64-System auszuführen, wenn Sie die Pakete binfmt-supportInstallieren Sie die binfmt-Unterstützung , qemuInstallieren Sie qemu und qemu-user-staticInstallieren Sie qemu-user-static installieren :

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

qemuführt dann eine Syscall-Emulation durch, wenn Sie die ausführbare Datei ausführen. Dies funktioniert für die meisten ARM-Binärdateien, es gibt jedoch einige, die möglicherweise nicht ordnungsgemäß ausgeführt werden.

Nathan Osman
quelle
sudo apt-get install binfmt-unterstützung qemu qemu-user-static
Momin Al Aziz
7

Ein solcher Fehler kann auftreten, wenn alle der folgenden Bedingungen erfüllt sind:

  • Die ausführbare Datei ist keine Datei, sondern ein Link
  • Sie führen es in VM aus
  • Die Datei befindet sich im freigegebenen Ordner
  • Ihr Host ist Windows.

Wenn Sie diese Datei erhalten haben, nehmen wir an, Sie befinden sich im Archiv. Versuchen Sie, sie in einer VM zu entpacken, beispielsweise in einem Verzeichnis auf dem virtuellen Laufwerk, das nicht dem Ordner auf der Festplatte Ihres Host-Computers zugeordnet ist /myNewDir/

Pavel
quelle
Das ist ziemlich hilfreich. Für mich habe ich eine Verknüpfung (Link) zu dieser ausführbaren Datei erstellt, und dann habe ich den Fehler erhalten, als ich die Verknüpfung ausgeführt habe.
Duc Tran
2

Sie müssen Ihre Datei mit einer geeigneten CPU-Architektur (z. B. x86) kompilieren und die EXE-Datei auf Ihrem Linux-Computer kopieren. Dann können Sie mono auf Ihrem Linux-Rechner installieren und den folgenden Befehl eingeben:

mono myprogram.exe
user3578181
quelle
2

Wenn mehr als eine javaauf dem System installiert ist, kann dies vorkommen und wird nicht als Standard festgelegt. Auf Ubuntu 14.04 LTS konnte ich es lösen, indem javaich folgendes ausführte und das benötigte auswählte .

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

Ich wähle 2 und setze openjdk-8als Standard. Welches zeigte nicht die Exec format error.

Lambzee
quelle
0

Dies kann auch passieren, wenn die Binärdatei eine libc-Implementierung verwendet, die nicht libc ist, z. B. musl. Heutzutage tritt dieses spezielle Problem höchstwahrscheinlich auf, wenn versucht wird, eine Binärdatei mit libc in einem Docker-Container mit einem auf alpine basierenden Image auszuführen. An der Binärdatei selbst kann nichts getan werden, um beide Umgebungen zu unterstützen, da die libc-Implementierung aus Gründen immer statisch verknüpft, dh direkt in die Binärdatei integriert sein muss.

Zyl
quelle