bash: ./program: tidak dapat menjalankan file biner: Kesalahan format Exec

92

Saya mencoba menjalankan program, tetapi kesalahan terjadi seperti ini:

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

Hasilnya file programadalah:

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

Bagaimana saya bisa memperbaiki kesalahan ini?

Saya menggunakan Ubuntu 14.04.2 (amd64) dengan VMware. Saya juga mencoba dengan Ubuntu i386, tetapi hasilnya sama.

Soongeun Hwang
sumber
4
Ini adalah executable ARM, yaitu Anda mengunduh format yang dapat dieksekusi yang salah atau dikompilasi untuk platform yang salah. Anda harus mendapatkan eksekusi yang tepat atau kompilasi ulang.
Karl Richter

Jawaban:

77

Anda mencoba menjalankan executable yang dikompilasi untuk arsitektur ARM pada arsitektur x86-64, yang mirip dengan meminta prosesor Anda yang hanya berbicara bahasa Inggris untuk mengambil arah dalam bahasa Cina.

Jika Anda perlu menjalankan executable itu, Anda memiliki dua pilihan:

  1. Dapatkan versi x86-64 dari executable (dengan cara apa pun; jika Anda tidak bisa mendapatkan versi executable x86-64 tetapi Anda bisa mendapatkan kode sumbernya, Anda dapat mencoba mengkompilasi ulangnya di mesin virtual );

  2. Instal Ubuntu Server untuk ARM sebagai pengganti Ubuntu 14.04.2 (amd64). Ini membutuhkan mesin fisik yang berjalan pada arsitektur ARM atau perangkat lunak virtualisasi yang dapat menirunya.

kos
sumber
23

Ini juga dapat terjadi jika Anda mencoba menjalankan executable x86-64 pada platform 32-bit.

Dalam satu contoh spesifik, saya mengunduh Visual Studio Code dan mencoba menjalankannya pada instalasi Ubuntu saya, tetapi saya tidak menyadari bahwa saya telah menginstal Ubuntu 32-bit di VM ini. Saya mendapatkan kesalahan ini, tetapi setelah mengunduh versi 32-bit, itu berjalan tanpa masalah.

Hughie Coles
sumber
8

Seringkali dimungkinkan untuk menjalankan gambar yang dapat dieksekusi ARM pada sistem amd64 jika Anda menginstal paket binfmt-supportInstal dukungan binfmt , qemuInstal qemu , dan qemu-user-staticInstal qemu-user-static :

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

qemukemudian akan melakukan emulasi syscall ketika Anda menjalankan executable. Ini berfungsi untuk sebagian besar binari ARM tetapi ada beberapa yang mungkin tidak berjalan dengan benar.

Nathan Osman
sumber
sudo apt-get install binfmt-support qemu qemu-user-static
Momin Al Aziz
7

Kesalahan tersebut dapat terjadi jika semua hal berikut ini benar:

  • Eksekusi bukan file tetapi tautan
  • Anda jalankan jalankan di dalam VM
  • File terletak di folder bersama
  • Tuan rumah Anda adalah Windows.

Jika Anda mendapatkan file itu, katakanlah, di arsip - cobalah untuk membukanya di dalam VM, di beberapa direktori di dalam drive virtual, bukan folder yang dipetakan ke hard drive mesin host Anda, misalnya /myNewDir/

Pavel
sumber
Itu cukup membantu. Bagi saya, saya membuat pintasan (tautan) ke file yang dapat dieksekusi itu, kemudian mengeksekusi pintasan memberi saya kesalahan.
Duc Tran
2

Anda harus mengkompilasi file Anda menggunakan arsitektur CPU yang sesuai (misalnya x86) dan menyalin file .exe di mesin linux Anda. Kemudian Anda dapat menginstal mono di mesin linux Anda dan mengeluarkan perintah berikut:

mono myprogram.exe
pengguna3578181
sumber
2

Jika lebih dari satu javadiinstal pada sistem ini mungkin terjadi dan tidak ditetapkan sebagai default. Pada Ubuntu14.04 LTS saya bisa menyelesaikannya dengan mengeksekusi mengikuti dan memilih yang javasaya butuhkan.

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

Saya memilih 2 dan menetapkan openjdk-8sebagai default. Yang tidak menunjukkan Exec format error.

lambzee
sumber
0

Ini juga bisa terjadi jika biner menggunakan implementasi libc yang bukan libc, seperti musl. Hari-hari ini masalah khusus ini kemungkinan besar ditemui ketika mencoba menjalankan biner dengan libc dalam wadah Docker dengan gambar berdasarkan alpine. Tidak ada yang dapat dilakukan untuk biner itu sendiri untuk mendukung kedua lingkungan, karena implementasi libc harus selalu dihubungkan secara statis, yaitu dibangun langsung ke dalam biner, karena alasan.

Zyl
sumber