bash: ./program: невозможно выполнить двоичный файл: ошибка формата Exec

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, но результат был таким же.

Soongeun Hwang
источник
4
Это исполняемый файл ARM, т. Е. Вы загрузили неверный формат исполняемого файла или скомпилировали для неправильной платформы. Вы должны получить правильный исполняемый файл или перекомпилировать.
Карл Рихтер

Ответы:

77

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

Если вам нужно запустить этот исполняемый файл, у вас есть два варианта:

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

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

кос
источник
23

Это также может произойти, если вы попытаетесь запустить исполняемый файл x86-64 на 32-разрядной платформе.

В одном конкретном случае я скачал код Visual Studio и попытался запустить его на своей установке Ubuntu, но я не понял, что я установил 32-битную Ubuntu в эту виртуальную машину. Я получил эту ошибку, но после загрузки 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, но есть некоторые, которые могут работать неправильно.

Натан Осман
источник
sudo apt-get install binfmt-support qemu qemu-user-static
Момин Аль Азиз
7

Такая ошибка может возникнуть, если выполняются все следующие условия:

  • Исполняемый файл - это не файл, а ссылка
  • Вы запускаете запустить его внутри ВМ
  • Файл находится в общей папке
  • Ваш хост - Windows.

Если вы получили этот файл, скажем, в архиве - попробуйте распаковать его внутри виртуальной машины, в какой-то каталог внутри виртуального диска, а не в папку, сопоставленную, например, с жестким диском хост-машины. /myNewDir/

Павел
источник
Это очень полезно. Для меня я создал ярлык (ссылку) на этот исполняемый файл, а затем вызвал ярлык ошибки.
Дык Тран
2

Вы должны скомпилировать свой файл, используя соответствующую архитектуру ЦП (например, x86), и скопировать файл .exe на свой компьютер с Linux. Затем вы можете установить mono на вашем Linux-компьютере и выполнить следующую команду:

mono myprogram.exe
user3578181
источник
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.

lambzee
источник
0

Это также может произойти, если двоичный файл использует реализацию libc, которая не является libc, например, musl. В эти дни эта конкретная проблема, скорее всего, встречается при попытке запуска двоичного файла с libc в контейнере Docker с изображением, основанным на alpine. Ничто не может быть сделано с самим двоичным файлом для поддержки обеих сред, потому что реализация libc всегда должна быть статически связана, то есть встроена непосредственно в двоичный файл, по причинам.

Зил
источник