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体系结构编译的可执行文件,这就像询问只会说英语的处理器以中文方向一样。

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

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

  2. 安装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可执行映像 安装binfmt-support , qemu 安装qemu 和qemu-user-static 安装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