问题描述
我正在尝试运行程序,但是会发生如下错误:
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
我该如何解决这个错误?
我在VMware上使用Ubuntu 14.04.2(amd64)。我也试过Ubuntu i386,但结果是一样的。
最佳解决方案
您正在尝试在x86-64架构上运行为ARM体系结构编译的可执行文件,这就像询问只会说英语的处理器以中文方向一样。
如果您需要运行该可执行文件,您有两个选择:
-
获取x86-64版本的可执行文件(无论如何;如果您无法获得x86-64版本的可执行文件但是您能够获取其源代码,则可以尝试在虚拟机上重新编译它);
-
安装Ubuntu Server for ARM代替Ubuntu 14.04.2(amd64)。这需要在ARM体系结构上运行的物理机器或可以模拟它的虚拟化软件。
次佳解决方案
如果您尝试在32位平台上运行x86-64可执行文件,也会发生这种情况。
在一个特定的例子中,我下载了Visual Studio Code并尝试在我的Ubuntu安装上运行它,但我没有意识到我在这个VM中安装了32位Ubuntu。我收到此错误,但在下载32位版本后,它运行没有问题。
第三种解决方案
如果安装binfmt-support,qemu和qemu-user-static软件包,通常可以在amd64系统上运行ARM可执行映像:
sudo apt install binfmt-support qemu qemu-user-static
然后,当您运行可执行文件时,qemu
将执行系统调用仿真。这适用于大多数ARM二进制文件,但有一些可能无法正常运行。
第四种方案
如果满足以下所有条件,则可能会发生此类错误:
-
可执行文件不是文件而是链接
-
你在VM内部运行它
-
文件位于共享文件夹中
-
你的主机是Windows。
如果你有这个文件,让我们说,在存档中 – 尝试在VM内部解压缩,在虚拟驱动器内的某个目录中,而不是映射到主机硬盘的文件夹,例如/myNewDir/
第五种方案
如果系统上安装了多个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
。