удар:./программировать: не может выполнить двоичный файл: Исполнительная ошибка формата

Я пытаюсь запустить программу, но ошибка происходит как это:

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

124
задан 31 May 2016 в 14:28

8 ответов

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

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

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

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

105
ответ дан 22 November 2019 в 23:07

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

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

qemu затем выполнит эмуляцию системных вызовов, когда вы запустить исполняемый файл. Это работает для большинства двоичных файлов ARM, но некоторые могут работать некорректно.

10
ответ дан 22 November 2019 в 23:07

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

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

24
ответ дан 22 November 2019 в 23:07

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

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

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

8
ответ дан 22 November 2019 в 23:07

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

mono myprogram.exe
2
ответ дан 22 November 2019 в 23:07

Если в системе установлено более одного 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 .

3
ответ дан 22 November 2019 в 23:07

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

0
ответ дан 22 November 2019 в 23:07

Я получил эту ошибку, пытаясь запустить zip-файл, содержащий исполняемый файл, а не извлекать его и запускать сам исполняемый файл xD

В дополнение к другим предлагаемым здесь ответам, я полагаю, будет Многие типы файлов, которые не предназначены для исполнения, могут вызывать эту ошибку.

0
ответ дан 5 January 2021 в 22:51

Другие вопросы по тегам:

Похожие вопросы: