bash:./ program:无法执行二进制文件:exec格式错误
我正在尝试运行程序,但是会发生如下错误:
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,通常可以在amd64系统上运行ARM可执行映像 , qemu 和qemu-user-static 包:
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
。
您必须使用适当的CPU体系结构(例如x86)编译文件,并在Linux机器上复制.exe文件。 然后你可以在linux机器上安装mono并发出以下命令:
mono myprogram.exe