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

55

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

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 15.07.2015 в 07:30
источник

6 ответов

45

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

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

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

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

ответ дан kos 15.07.2015 в 07:39
14

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

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

    
ответ дан Hughie Coles 11.09.2015 в 01:44
5

Часто можно запустить исполняемый образ ARM в системе amd64, если вы установите binfmt-support , qemu и qemu-user-static < img src="https://hostmar.co/software-small"> пакеты:

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

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

    
ответ дан Nathan Osman 27.10.2016 в 08:41
4

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

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

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

    
ответ дан Pavel 13.11.2015 в 23:22
1

Если в системе установлено более одного 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 06.06.2016 в 15:43
0

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

mono myprogram.exe
    
ответ дан user3578181 28.02.2016 в 20:49