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 program
war:
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.
executable
Soongeun Hwang
quelle
quelle
Antworten:
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:
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 );
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.
quelle
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.
quelle
Es ist häufig möglich, ein ausführbares ARM-Image auf einem amd64-System auszuführen, wenn Sie die Pakete binfmt-support , qemu und qemu-user-static installieren :
qemu
fü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.quelle
Ein solcher Fehler kann auftreten, wenn alle der folgenden Bedingungen erfüllt sind:
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/
quelle
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:
quelle
Wenn mehr als eine
java
auf dem System installiert ist, kann dies vorkommen und wird nicht als Standard festgelegt. Auf Ubuntu 14.04 LTS konnte ich es lösen, indemjava
ich folgendes ausführte und das benötigte auswählte .Ich wähle 2 und setze
openjdk-8
als Standard. Welches zeigte nicht dieExec format error
.quelle
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.
quelle