Я пытаюсь запустить программу, но ошибка происходит как это:
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, но результат был тем же.
Вы пытаетесь запустить исполняемый файл, скомпилированный для архитектуры ARM на архитектуре x86-64, что очень похоже на просьбу вашего процессора, который говорит только по-английски, указать указания на китайском языке.
Если вам нужно запустить этот исполняемый файл, у вас есть два варианта:
Получить версию исполняемого файла x86-64 (в любом случае; если вы не можете получить версию исполняемого файла x86-64, но можете получить его исходный код, вы можете попробовать перекомпилировать его на виртуальной машине);
Установите Ubuntu Server для ARM вместо Ubuntu 14.04.2 (amd64). Для этого требуется либо физическая машина, работающая на архитектуре ARM, либо программное обеспечение виртуализации, которое может ее эмулировать.
Часто можно запустить исполняемый образ ARM в системе amd64, если вы установите binfmt-support , qemu и пакеты qemu-user-static :
sudo apt install binfmt-support qemu qemu-user-static
qemu
затем выполнит эмуляцию системных вызовов, когда вы запустить исполняемый файл. Это работает для большинства двоичных файлов ARM, но некоторые могут работать некорректно.
Это также может произойти, если вы попытаетесь запустить исполняемый файл x86-64 на 32-битной платформе.
В одном конкретном случае я загрузил код Visual Studio и попытался запустить его в своей установке Ubuntu, но Я не осознавал, что установил 32-битный Ubuntu на этой виртуальной машине. Я получил эту ошибку, но после загрузки 32-разрядной версии все прошло без проблем.
Такая ошибка может возникнуть, если все следующие данные верны:
Если у вас есть этот файл, скажем, в архиве - попробуйте распаковать его внутри VM, в какой-нибудь директории внутри виртуального диска, а не в папке, привязанной к жесткому диску вашей хост-машины, например /myNewDir/
Вы должны скомпилировать файл, используя соответствующая архитектура ЦП (x86 например) и скопируйте файл .exe на свой компьютер с Linux. Затем вы можете установить mono на свой Linux-компьютер и ввести следующую команду:
mono myprogram.exe
Если в системе установлено более одного 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
.
Это также может произойти, если двоичный файл использует реализацию libc, которая не является libc, например musl. В наши дни эта конкретная проблема чаще всего встречается при попытке запустить двоичный файл с libc в контейнере Docker с образом, основанным на alpine. Нет ничего, что можно было бы сделать с самим двоичным файлом для поддержки обеих сред, потому что реализация libc всегда должна быть связана статически, то есть встроена непосредственно в двоичный файл по определенным причинам.
Я получил эту ошибку, пытаясь запустить zip-файл, содержащий исполняемый файл, а не извлекать его и запускать сам исполняемый файл xD
В дополнение к другим предлагаемым здесь ответам, я полагаю, будет Многие типы файлов, которые не предназначены для исполнения, могут вызывать эту ошибку.