bash: ./program: nie można wykonać pliku binarnego: błąd formatu wykonania


91

Próbuję uruchomić program, ale występuje taki błąd:

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

Rezultatem file programbyło:

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

Jak mogę naprawić ten błąd?

Używam Ubuntu 14.04.2 (amd64) z VMware. Próbowałem również z Ubuntu i386, ale wynik był taki sam.


4
Jest to plik wykonywalny ARM, tzn. Pobrałeś niewłaściwy format pliku wykonywalnego lub skompilowałeś dla niewłaściwej platformy. Musisz uzyskać odpowiedni plik wykonywalny lub ponownie skompilować.
Karl Richter

Odpowiedzi:


76

Próbujesz uruchomić plik wykonywalny skompilowany dla architektury ARM na architekturze x86-64, co jest bardzo podobne do proszenia procesora, który mówi tylko po angielsku, o instrukcje w języku chińskim.

Jeśli chcesz uruchomić ten plik wykonywalny, masz dwie możliwości:

  1. Uzyskaj wersję pliku wykonywalnego x86-64 (w każdym razie; jeśli nie możesz uzyskać wersji pliku wykonywalnego x86-64, ale możesz uzyskać jego kod źródłowy, możesz spróbować ponownie skompilować na maszynie wirtualnej );

  2. Zainstaluj Ubuntu Server dla ARM zamiast Ubuntu 14.04.2 (amd64). Wymaga to albo fizycznej maszyny działającej na architekturze ARM, albo oprogramowania do wirtualizacji, które może ją emulować.


22

Może się to również zdarzyć, jeśli spróbujesz uruchomić plik wykonywalny x86-64 na platformie 32-bitowej.

W jednym konkretnym przypadku pobrałem Visual Studio Code i próbowałem uruchomić go w mojej instalacji Ubuntu, ale nie zdałem sobie sprawy, że zainstalowałem 32-bitowy Ubuntu na tej maszynie wirtualnej. Wystąpił ten błąd, ale po pobraniu wersji 32-bitowej działał bez problemu.


8

Często możliwe jest uruchomienie obrazu wykonywalnego ARM w systemie amd64, jeśli zainstalujesz pakiety binfmt-supportZainstaluj obsługę binfmt , qemuZainstaluj qemu i qemu-user-staticZainstaluj qemu-user-static :

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

qemuwykona następnie emulację syscall po uruchomieniu pliku wykonywalnego. Działa to w przypadku większości plików binarnych ARM, ale niektóre z nich mogą nie działać poprawnie.


sudo apt-get install binfmt-support qemu qemu-user-statyczne
Momin Al Aziz

7

Taki błąd może wystąpić, jeśli spełnione są wszystkie poniższe warunki:

  • Plik wykonywalny to nie plik, ale łącze
  • Uruchom go w maszynie wirtualnej
  • Plik znajduje się w folderze współdzielonym
  • Twoim hostem jest system Windows.

Jeśli masz ten plik, powiedzmy, w archiwum - spróbuj go rozpakować w maszynie wirtualnej, w jakimś katalogu wewnątrz dysku wirtualnego, a nie na przykład na dysku twardym komputera hosta /myNewDir/


To bardzo pomocne. Dla mnie utworzyłem skrót (link) do tego pliku wykonywalnego, a następnie wykonanie skrótu dało mi błąd.
Duc Tran

2

Musisz skompilować plik przy użyciu odpowiedniej architektury procesora (na przykład x86) i skopiować plik .exe na maszynę z systemem Linux. Następnie możesz zainstalować mono na komputerze z systemem Linux i wydać następujące polecenie:

mono myprogram.exe

2

Jeśli javaw systemie zainstalowanych jest więcej niż jeden, może się tak zdarzyć i nie zostać ustawiony jako domyślny. Na Ubuntu14.04 LTS mogłem rozwiązać problem, wykonując następujące czynności i wybierając javapotrzebne.

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

Wybieram 2 i ustawiam openjdk-8domyślnie. Który nie pokazał Exec format error.


0

Może się to również zdarzyć, jeśli plik binarny używa implementacji libc, która nie jest libc, na przykład musl. Obecnie ten konkretny problem jest najprawdopodobniej spotykany podczas próby uruchomienia pliku binarnego z libc w kontenerze Docker z obrazem opartym na alpine. Nic nie można zrobić z samym plikiem binarnym, aby obsługiwać oba środowiska, ponieważ implementacja libc musi być zawsze powiązana statycznie, tj. Wbudowana bezpośrednio w plik binarny, z powodów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.