bash: ./program: impossibile eseguire il file binario: errore di formato Exec

64

Sto cercando di eseguire un programma, ma un errore si verifica in questo modo:

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

Il risultato di file program era:

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

Come posso correggere questo errore?

Uso Ubuntu 14.04.2 (amd64) con VMware. Ho anche provato con Ubuntu i386, ma il risultato è stato lo stesso.

    
posta Soongeun Hwang 15.07.2015 - 07:30

6 risposte

54

Stai provando a eseguire un eseguibile compilato per un'architettura ARM su un'architettura x86-64, il che equivale a chiedere al tuo processore che parla solo inglese di prendere direzioni in cinese.

Se hai bisogno di eseguire quell'eseguibile hai due scelte:

  1. Ottieni una versione x86-64 dell'eseguibile (con qualsiasi mezzo, se non riesci a ottenere una versione x86-64 dell'eseguibile ma sei in grado di ottenere il suo codice sorgente, puoi provare a ricompilalo sulla macchina virtuale);

  2. Installa Ubuntu Server for ARM al posto di Ubuntu 14.04.2 (amd64). Ciò richiede o una macchina fisica in esecuzione su un'architettura ARM o un software di virtualizzazione in grado di emularlo.

risposta data kos 15.07.2015 - 07:39
19

Questo può verificarsi anche se si tenta di eseguire un eseguibile x86-64 su una piattaforma a 32 bit.

In un'istanza specifica, ho scaricato Visual Studio Code e ho provato a eseguirlo sulla mia installazione di Ubuntu, ma non mi ero reso conto di aver installato Ubuntu a 32 bit in questa VM. Ho ricevuto questo errore, ma dopo aver scaricato la versione a 32 bit, è stata eseguita senza problemi.

    
risposta data Hughie Coles 11.09.2015 - 01:44
6

Spesso è possibile eseguire un'immagine eseguibile ARM su un sistema amd64 se si installa binfmt-support , qemu e qemu-user-static < img src="https://hostmar.co/software-small"> pacchetti:

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

qemu eseguirà quindi l'emulazione di syscall quando esegui l'eseguibile. Questo funziona per la maggior parte dei binari di ARM, ma ce ne sono alcuni che potrebbero non funzionare correttamente.

    
risposta data Nathan Osman 27.10.2016 - 08:41
6

Tale errore può verificarsi se sono vere tutte le seguenti condizioni:

  • Eseguibile non è un file ma un collegamento
  • Si esegue eseguirlo all'interno di VM
  • Il file si trova nella cartella condivisa
  • Il tuo host è Windows.

Se hai quel file, diciamo, in archivio - prova a decomprimerlo all'interno della VM, in qualche directory all'interno di un'unità virtuale, non in una cartella mappata sul disco rigido della macchina host, ad esempio /myNewDir/

    
risposta data Pavel 13.11.2015 - 23:22
2

Se sul sistema è installato più di un java , ciò potrebbe accadere e non essere impostato come predefinito. Su Ubuntu14.04 LTS ho potuto risolverlo eseguendo il seguente e scegliendo il java di cui avevo bisogno.

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

Ho scelto 2 e impostato openjdk-8 come predefinito. Quale non ha mostrato il Exec format error .

    
risposta data lambzee 06.06.2016 - 15:43
1

È necessario compilare il file utilizzando un'architettura CPU appropriata (ad esempio x86) e copiare il file .exe sulla macchina Linux. Quindi puoi installare mono sulla tua macchina Linux e inviare il seguente comando:

mono myprogram.exe
    
risposta data user3578181 28.02.2016 - 20:49

Leggi altre domande sui tag