bash: ./program: ไม่สามารถเรียกใช้ไฟล์ไบนารี่ได้: Exec format error


92

ฉันพยายามเรียกใช้โปรแกรม แต่มีข้อผิดพลาดเกิดขึ้นเช่นนี้:

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

ผลลัพธ์ของfile programคือ:

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

ฉันจะแก้ไขข้อผิดพลาดนี้ได้อย่างไร?

ฉันใช้ Ubuntu 14.04.2 (amd64) กับ VMware ฉันยังลองกับ Ubuntu i386 แต่ผลลัพธ์ก็เหมือนกัน


4
มันเป็นไฟล์เอ็กซีคิวต์ ARM นั่นคือคุณดาวน์โหลดรูปแบบไฟล์เอ็กซีคิวต์ที่ไม่ถูกต้องหรือคอมไพล์สำหรับแพลตฟอร์มที่ไม่ถูกต้อง คุณต้องได้รับการปฏิบัติการที่ถูกต้องหรือคอมไพล์ใหม่
Karl Richter

คำตอบ:


77

คุณกำลังพยายามเรียกใช้งานคอมไพล์ที่ประมวลผลได้สำหรับสถาปัตยกรรม ARM บนสถาปัตยกรรม x86-64 ซึ่งเหมือนกับถามตัวประมวลผลของคุณที่พูดภาษาอังกฤษเพื่อบอกทิศทางเป็นภาษาจีนเท่านั้น

หากคุณต้องการเรียกใช้ไฟล์ปฏิบัติการคุณมีสองทางเลือก:

  1. รับเวอร์ชัน x86-64 ของ executable (ไม่ว่าจะด้วยวิธีใดก็ตาม) หากคุณไม่สามารถเรียกใช้เวอร์ชัน x86-64 ได้ แต่คุณสามารถรับซอร์สโค้ดได้คุณสามารถลองคอมไพล์ใหม่บนเครื่องเสมือนได้ );

  2. ติดตั้งUbuntu Server สำหรับ ARMแทน Ubuntu 14.04.2 (amd64) สิ่งนี้ต้องการเครื่องทางกายภาพที่ทำงานบนสถาปัตยกรรม ARM หรือซอฟต์แวร์การจำลองเสมือนที่สามารถจำลองได้


23

สิ่งนี้สามารถเกิดขึ้นได้หากคุณพยายามรัน x86-64 ที่รันได้บนแพลตฟอร์ม 32 บิต

ในอินสแตนซ์หนึ่งที่เฉพาะเจาะจงฉันดาวน์โหลด Visual Studio Code และพยายามเรียกใช้บนการติดตั้ง Ubuntu ของฉัน แต่ฉันไม่ได้ตระหนักว่าฉันได้ติดตั้ง Ubuntu 32 บิตใน VM นี้ ฉันได้รับข้อผิดพลาดนี้ แต่หลังจากดาวน์โหลดรุ่น 32 บิตแล้วมันก็วิ่งได้โดยไม่มีปัญหา


8

บ่อยครั้งที่เป็นไปได้ที่จะรันอิมเมจที่รันได้ ARM บนระบบ amd64 ถ้าคุณติดตั้งbinfmt-supportติดตั้ง binfmt-support , qemuติดตั้ง qemuและแพ็คเกจqemu-user-staticติดตั้ง qemu-user-static :

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

qemuจะทำการจำลอง syscall เมื่อคุณเรียกใช้โปรแกรม วิธีนี้ใช้ได้กับ ARM ARM ส่วนใหญ่ แต่มีบางอย่างที่อาจทำงานไม่ถูกต้อง


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

7

ข้อผิดพลาดดังกล่าวอาจเกิดขึ้นหากสิ่งต่อไปนี้เป็นจริง:

  • ปฏิบัติการได้ไม่ใช่ไฟล์ แต่เป็นลิงค์
  • คุณเรียกใช้ภายใน VM
  • ไฟล์อยู่ในโฟลเดอร์ที่แชร์
  • โฮสต์ของคุณคือ Windows

หากคุณมีไฟล์นั้นสมมติว่าอยู่ในไฟล์เก็บถาวร - ลองแกะใน VM ในบางไดเรกทอรีในไดรฟ์เสมือนไม่ใช่โฟลเดอร์ที่แมปกับฮาร์ดไดรฟ์เครื่องโฮสต์ของคุณตัวอย่างเช่น /myNewDir/


นั่นเป็นประโยชน์มาก สำหรับฉันฉันสร้างทางลัด (ลิงค์) ไปยังไฟล์ที่ปฏิบัติการได้จากนั้นการดำเนินการทางลัดนั้นทำให้ฉันเกิดข้อผิดพลาด
Duc Tran

2

คุณต้องรวบรวมไฟล์ของคุณโดยใช้สถาปัตยกรรม CPU ที่เหมาะสม (เช่น x86) และคัดลอกไฟล์. exe บนเครื่อง linux ของคุณ จากนั้นคุณสามารถติดตั้งโมโนบนเครื่อง linux ของคุณและออกคำสั่งต่อไปนี้:

mono myprogram.exe

2

หากjavaมีการติดตั้งมากกว่าหนึ่งระบบในสิ่งนี้อาจเกิดขึ้นและไม่ได้ตั้งเป็นค่าเริ่มต้น บน Ubuntu14.04 LTS ฉันสามารถแก้ไขได้โดยดำเนินการตามและเลือกjavaฉันต้องการ

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

ฉันเลือก 2 และตั้งopenjdk-8เป็นค่าเริ่มต้น Exec format errorซึ่งไม่ได้แสดง


0

สิ่งนี้สามารถเกิดขึ้นได้หากไบนารีใช้การใช้งาน libc ซึ่งไม่ใช่ libc เช่น musl ทุกวันนี้ปัญหาเฉพาะนี้มักเกิดขึ้นเมื่อพยายามเรียกใช้ไบนารีด้วย libc ในคอนเทนเนอร์ Docker ที่มีรูปภาพอ้างอิงจากอัลไพน์ ไม่มีสิ่งใดที่สามารถทำได้กับไบนารีของตัวเองเพื่อสนับสนุนสภาพแวดล้อมทั้งสองเพราะการใช้งาน libc จะต้องเชื่อมโยงแบบคงที่เช่นสร้างขึ้นโดยตรงในไบนารีด้วยเหตุผล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.