Vraag bash: ./program: kan binair bestand niet uitvoeren: Exec-formaatfout


Ik probeer een programma uit te voeren, maar een fout gebeurt als volgt:

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

Het resultaat van file program was:

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

Hoe kan ik deze fout oplossen?

Ik gebruik Ubuntu 14.04.2 (amd64) met VMware. Ik heb ook geprobeerd met Ubuntu i386, maar het resultaat was hetzelfde.


66
2017-07-15 05:30


oorsprong


Het is een ARM-bestand, d.w.z. je hebt het verkeerde uitvoerbare formaat gedownload of gecompileerd voor het verkeerde platform. Je moet het juiste uitvoerbare bestand krijgen of opnieuw compileren. - Karl Richter


antwoorden:


U probeert een uitvoerbaar bestand op te zetten dat is gecompileerd voor een ARM-architectuur op een x86-64-architectuur, wat hetzelfde is als uw processor vragen die alleen Engels spreekt om aanwijzingen in het Chinees op te nemen.

Als u dat uitvoerbare bestand moet uitvoeren, hebt u twee keuzes:

  1. Haal een x86-64-versie van het uitvoerbare bestand op (gemiddeld, als het niet lukt om een ​​x86-64-versie van het uitvoerbare bestand te krijgen, maar u kunt de broncode ophalen, kunt u proberen het opnieuw te compileren op de virtuele machine );

  2. Installeren Ubuntu-server voor ARM in plaats van Ubuntu 14.04.2 (amd64). Hiervoor is een fysieke machine nodig die op een ARM-architectuur draait of een virtualisatiesoftware die deze kan emuleren.


56
2017-07-15 05:39





Dit kan ook gebeuren als u probeert een uitvoerbaar bestand x86-64 op een 32-bits platform uit te voeren.

In een specifiek geval heb ik Visual Studio Code gedownload en geprobeerd het op mijn Ubuntu-installatie uit te voeren, maar ik had me niet gerealiseerd dat ik 32-bits Ubuntu in deze VM had geïnstalleerd. Ik kreeg deze foutmelding, maar na het downloaden van de 32-bits versie ging het probleemloos.


19
2017-09-10 23:44





Het is vaak mogelijk om een ​​uitvoerbare afbeelding van een ARM uit te voeren op een amd64-systeem als u de binfmt-support Install binfmt-support, qemu Install qemu, en qemu-user-statische Install qemu-user-static pakketjes:

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

qemu voert vervolgens syscall-emulatie uit wanneer u het uitvoerbare bestand uitvoert. Dit werkt voor de meeste ARM binaries, maar er zijn er een paar die mogelijk niet correct werken.


6
2017-10-27 06:41



sudo apt-get install binfmt-ondersteuning qemu qemu-user-static - Momin Al Aziz


Een dergelijke fout kan optreden als alle volgende punten waar zijn:

  • Uitvoerbaar bestand is geen bestand maar een link
  • Je draait het binnen VM
  • Het bestand bevindt zich in de gedeelde map
  • Je host is Windows.

Als je dat bestand hebt, laat ons zeggen, in een archief - probeer het uit te pakken in de VM, in een map binnen het virtuele station, niet in een map die is toegewezen aan de harde schijf van je hostcomputer, bijvoorbeeld /myNewDir/


6
2017-11-13 22:22



Dat is erg handig. Voor mij maakte ik een snelkoppeling (link) naar dat uitvoerbare bestand, waarna het uitvoeren van de snelkoppeling me de fout gaf. - Duc Tran


Als er meer dan één java is geïnstalleerd op het systeem dit kan gebeuren en niet als standaard ingesteld. Op Ubuntu14.04 LTS kon ik het opgelost krijgen door het volgende uit te voeren en het te kiezen java Ik had nodig.

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

Ik kies 2 en stel in openjdk-8 als een standaard. Welke niet het Exec format error.


2
2018-06-06 13:43





U moet uw bestand compileren met behulp van een geschikte CPU-architectuur (bijvoorbeeld x86) en het .exe-bestand op uw linux-machine kopiëren. Daarna kun je mono op je linux-machine installeren en de volgende opdracht geven:

mono myprogram.exe

1
2018-02-28 19:49