bash: ./program: không thể thực thi tệp nhị phân: Lỗi định dạng Exec


92

Tôi đang cố chạy một chương trình, nhưng một lỗi xảy ra như thế này:

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

Kết quả file programlà:

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

Làm thế nào tôi có thể sửa lỗi này?

Tôi đang sử dụng Ubuntu 14.04.2 (amd64) với VMware. Tôi cũng đã thử với Ubuntu i386, nhưng kết quả vẫn như vậy.


4
Đó là một tệp thực thi ARM, tức là bạn đã tải xuống định dạng thực thi sai hoặc được biên dịch cho nền tảng sai. Bạn phải có được thực thi đúng hoặc biên dịch lại.
Karl Richter

Câu trả lời:


77

Bạn đang cố chạy một tệp thực thi được biên dịch cho kiến ​​trúc ARM trên kiến ​​trúc x86-64, giống như yêu cầu bộ xử lý của bạn chỉ nói tiếng Anh chỉ đường bằng tiếng Trung.

Nếu bạn cần chạy chương trình thực thi đó, bạn có hai lựa chọn:

  1. Nhận phiên bản x86-64 của tệp thực thi (bằng mọi cách; nếu bạn không thể có phiên bản x86-64 của tệp thực thi nhưng bạn có thể lấy mã nguồn của nó, bạn có thể thử biên dịch lại trên máy ảo );

  2. Cài đặt Ubuntu Server cho ARM thay cho Ubuntu 14.04.2 (amd64). Điều này đòi hỏi một máy vật lý chạy trên kiến ​​trúc ARM hoặc phần mềm ảo hóa có thể mô phỏng nó.


23

Điều này cũng có thể xảy ra nếu bạn cố chạy một tệp thực thi x86-64 trên nền tảng 32 bit.

Trong một trường hợp cụ thể, tôi đã tải xuống Visual Studio Code và cố gắng chạy nó trên bản cài đặt Ubuntu của mình, nhưng tôi đã nhận ra rằng tôi đã cài đặt Ubuntu 32 bit trong VM này. Tôi đã gặp lỗi này, nhưng sau khi tải xuống phiên bản 32 bit, nó đã chạy mà không gặp vấn đề gì.


8

Bạn thường có thể chạy hình ảnh thực thi ARM trên hệ thống amd64 nếu bạn cài đặt các gói binfmt-supportCài đặt binfmt-hỗ trợ , qemuCài đặt qemuqemu-user-staticCài đặt qemu-user-static :

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

qemusau đó sẽ thực hiện mô phỏng tòa nhà khi bạn chạy chương trình thực thi. Điều này hoạt động cho hầu hết các nhị phân ARM nhưng có một số ít có thể không chạy chính xác.


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

7

Lỗi như vậy có thể xảy ra nếu tất cả những điều sau đây là đúng:

  • Thực thi không phải là một tập tin mà là một liên kết
  • Bạn chạy chạy nó trong VM
  • Tập tin được đặt trong thư mục chia sẻ
  • Máy chủ của bạn là Windows.

Nếu bạn có tệp đó, giả sử, trong kho lưu trữ - hãy thử giải nén nó trong VM, trong một số thư mục bên trong ổ đĩa ảo, không phải thư mục được ánh xạ vào ổ cứng máy chủ của bạn, ví dụ /myNewDir/


Điều đó khá hữu ích. Đối với tôi, tôi đã tạo một lối tắt (liên kết) đến tệp thực thi đó, sau đó thực hiện phím tắt đã cho tôi lỗi.
Đức Trần

2

Bạn phải biên dịch tệp của mình bằng kiến ​​trúc CPU thích hợp (ví dụ x86) và sao chép tệp .exe trên máy linux của bạn. Sau đó, bạn có thể cài đặt mono trên máy linux của mình và ra lệnh sau:

mono myprogram.exe

2

Nếu có nhiều hơn một javacài đặt trên hệ thống, điều này có thể xảy ra và không được đặt làm mặc định. Trên Ubuntu14.04 LTS tôi có thể giải quyết nó bằng cách thực hiện theo và chọn cái javatôi cần.

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

Tôi chọn 2 và đặt openjdk-8làm mặc định. Mà đã không hiển thị Exec format error.


0

Điều này cũng có thể xảy ra nếu nhị phân sử dụng triển khai libc không phải là libc, chẳng hạn như musl. Ngày nay, vấn đề cụ thể này rất có thể gặp phải khi cố gắng chạy nhị phân với libc trong bộ chứa Docker với hình ảnh dựa trên alpine. Không có gì có thể được thực hiện cho chính nhị phân để hỗ trợ cả hai môi trường, bởi vì việc triển khai libc phải luôn được liên kết tĩnh, tức là được xây dựng trực tiếp vào nhị phân, vì những lý do.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.