我正在尝试运行一个程序,但它给出了一个错误:
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,但结果是一样的。
答案1
您正尝试在 x86-64 架构上运行为 ARM 架构编译的可执行文件,这就像要求只会说英语的处理器用中文接受指示一样。
如果需要运行该可执行文件,您有两个选择:
获取可执行文件的 x86-64 版本(无论如何;如果您无法获取可执行文件的 x86-64 版本但能够获取其源代码,则可以尝试在虚拟机上重新编译它);
安装适用于 ARM 的 Ubuntu 服务器代替 Ubuntu 14.04.2 (amd64)。这需要运行在 ARM 架构上的物理机或可以模拟它的虚拟化软件。
答案2
如果您尝试在 32 位平台上运行 x86-64 可执行文件,也会发生这种情况。
在一个特定实例中,我下载了 Visual Studio Code 并尝试在我的 Ubuntu 安装上运行它,但我没有意识到我在这个虚拟机中安装了 32 位 Ubuntu。我收到此错误,但在下载 32 位版本后,它运行起来没有问题。
答案3
binfmt-support
如果安装了、qemu
和qemu-user-static
包,通常可以在 amd64 系统上运行 ARM 可执行映像:
sudo apt install binfmt-support qemu qemu-user-static
qemu
然后,当您运行可执行文件时,将执行系统调用模拟。这适用于大多数 ARM 二进制文件,但有些可能无法正确运行。
答案4
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
。