Próbuję uruchomić program, ale występuje taki błąd:
bash: ./program: cannot execute binary file: Exec format error
Rezultatem file program
był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.
executable
Soongeun Hwang
źródło
źródło
Odpowiedzi:
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:
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 );
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ć.
źródło
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.
źródło
Często możliwe jest uruchomienie obrazu wykonywalnego ARM w systemie amd64, jeśli zainstalujesz pakiety binfmt-support , qemu i qemu-user-static :
qemu
wykona 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.źródło
Taki błąd może wystąpić, jeśli spełnione są wszystkie poniższe warunki:
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/
źródło
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:
źródło
Jeśli
java
w 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ącjava
potrzebne.Wybieram 2 i ustawiam
openjdk-8
domyślnie. Który nie pokazałExec format error
.źródło
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.
źródło