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可执行文件,即您下载了错误的可执行文件格式或针对错误的平台进行了编译。您必须获取正确的可执行文件或重新编译。
Karl Richter

Answers:


76

您正在尝试在x86-64架构上运行针对ARM架构编译的可执行文件,这就像让您的只会说英语的处理器以中文指示方向。

如果您需要运行该可执行文件,则有两种选择:

  1. 获取x86-64版本的可执行文件(无论如何;如果无法获得x86-64版本的可执行文件,但能够获取其源代码,则可以尝试在虚拟机上重新编译它);

  2. 安装Ubuntu Server for ARM代替Ubuntu 14.04.2(amd64)。这需要运行在ARM体系结构上的物理机或可以对其进行仿真的虚拟化软件。


22

如果您尝试在32位平台上运行x86-64可执行文件,也会发生这种情况。

在一个特定的实例中,我下载了Visual Studio Code并尝试在Ubuntu安装中运行它,但是我没有意识到我已经在此VM中安装了32位Ubuntu。我收到此错误,但是下载32位版本后,它没有问题。



7

如果满足以下所有条件,则可能会发生此错误:

  • 可执行文件不是文件,而是链接
  • 您在VM内运行它
  • 文件位于共享文件夹中
  • 您的主机是Windows。

如果得到了该文件,例如在存档中-尝试在VM内部,虚拟驱动器内的某个目录中解压缩该文件,而不是将其映射到主机硬盘驱动器中的文件夹中 /myNewDir/


这很有帮助。对我来说,我创建了一个指向该可执行文件的快捷方式(链接),然后执行该快捷方式给了我错误。
杜克·崔

2

您必须使用适当的CPU架构(例如x86)编译文件,然后将.exe文件复制到Linux机器上。然后,您可以在Linux机器上安装mono并发出以下命令:

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),也会发生这种情况。如今,当尝试在具有基于alpine映像的Docker容器中使用libc运行二进制文件时,最有可能遇到此特定问题。二进制文件本身无法支持两种环境,因为libc实现必须始终静态链接,即出于某种原因直接构建到二进制文件中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.