bash: ./program: не може виконати бінарний файл: помилка формату Exec


91

Я намагаюся запустити програму, але трапляється помилка приблизно так:

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, тобто ви завантажили неправильний формат або виконали компіляцію для неправильної платформи. Ви повинні отримати потрібний виконаний файл або перекомпілювати.
Карл Ріхтер

Відповіді:


76

Ви намагаєтеся запустити виконуваний файл, скомпільований для архітектури ARM, на архітектурі x86-64, що схоже на те, щоб попросити ваш процесор, який розмовляє лише англійською, прокласти вказівки китайською мовою.

Якщо вам потрібно запустити цей виконуваний файл, у вас є два варіанти:

  1. Отримайте версію x86-64 виконуваного файлу (будь-яким способом; якщо ви не можете отримати версію x86-64 виконуваного файлу, але ви можете отримати його вихідний код, ви можете спробувати перекомпілювати його на віртуальній машині );

  2. Встановіть Ubuntu Server для ARM замість Ubuntu 14.04.2 (amd64). Для цього потрібна або фізична машина, що працює на архітектурі ARM, або програмне забезпечення для віртуалізації, яке може імітувати її.


22

Це також може статися, якщо ви спробуєте запустити виконуваний файл x86-64 на 32-бітній платформі.

В одному конкретному випадку я завантажив Visual Studio Code і спробував запустити його на моїй установці Ubuntu, але я не зрозумів, що я встановив 32-розрядний Ubuntu в цій машині. Я отримав цю помилку, але після завантаження 32-розрядної версії він запустився без проблем.


8

Часто можливо запустити виконуваний образ ARM в системі amd64, якщо встановити статичні пакети binfmt-supportВстановіть підтримку binfmt , qemuВстановити qemu та qemu-userВстановіть qemu-user-static :

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

qemuтоді буде виконуватися емуляція syscall під час запуску виконуваного файлу. Це працює для більшості бінарних файлів ARM, але є кілька, які можуть працювати неправильно.


sudo apt-get install binfmt-support qemu qemu-user-static
Момін Аль Азіз

7

Така помилка може виникнути, якщо всі наведені нижче дії є істинними:

  • Виконавчий файл - це не файл, а посилання
  • Ви запускаєте запустити його всередині VM
  • Файл знаходиться у загальній папці
  • Ваш хост - це Windows.

Якщо ви отримали цей файл, скажімо, в архіві - спробуйте розпакувати його всередині VM, в деякому каталозі всередині віртуального диска, а не папки, відображеної на жорсткий диск вашої машини, наприклад /myNewDir/


Це дуже корисно. Для мене я створив ярлик (посилання) на цей виконуваний файл, потім виконання ярлика дало мені помилку.
Duc Tran

2

Ви повинні скласти файл за допомогою відповідної архітектури процесора (наприклад, 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 завжди повинна бути пов'язана статично, тобто вбудована безпосередньо в бінарне, з причин.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.