web-dev-qa-db-ja.com

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でも試しましたが、結果は同じでした。

89
Soongeun Hwang

X86-64アーキテクチャ上でARMアーキテクチャ用にコンパイルされた実行可能ファイルを実行しようとしています。これは、英語のみを話すプロセッサに中国語で指示するように依頼することに似ています。

その実行可能ファイルを実行する必要がある場合、2つの選択肢があります。

  1. X86-64バージョンの実行可能ファイルを取得します(どういうわけか、x86-64バージョンの実行可能ファイルを取得できないが、そのソースコードを取得できる場合は、仮想マシンで再コンパイルを試みることができます);

  2. Ubuntu 14.04.2(AMD64)の代わりに ARM用Ubuntuサーバー をインストールします。これには、ARMアーキテクチャで実行されている物理マシンまたはそれをエミュレートできる仮想化ソフトウェアが必要です。

74
kos

これは、32ビットプラットフォームでx86-64実行可能ファイルを実行しようとした場合にも発生する可能性があります。

特定の例では、Visual Studio Codeをダウンロードし、Ubuntuインストールで実行しようとしましたが、このVMに32ビットUbuntuがインストールされていることに気づいていませんでした。このエラーが発生しましたが、32ビットバージョンをダウンロードした後、問題なく実行されました。

22
Hughie Coles

binfmt-supportをインストールすると、多くの場合、AMD64システムでARM実行可能イメージを実行できます。 Install binfmt-supportqemu Install qemu 、および qemu-user-static Install qemu-user-static パッケージ:

Sudo apt install binfmt-support qemu qemu-user-static

qemuは、実行可能ファイルを実行するときにsyscallエミュレーションを実行します。これはほとんどのARMバイナリで機能しますが、いくつかは正しく動作しない可能性があります。

8
Nathan Osman

次のすべてに該当する場合、このようなエラーが発生する可能性があります。

  • 実行可能ファイルはファイルではなくリンクです
  • VM内で実行します
  • ファイルは共有フォルダーにあります
  • ホストはWindowsです。

そのファイルを取得した場合、たとえば、アーカイブで、VM内で、ホストマシンのハードドライブにマップされたフォルダーではなく、仮想ドライブ内のいくつかのディレクトリで、たとえば/myNewDir/

7
Pavel

適切なCPUアーキテクチャ(x86など)を使用してファイルをコンパイルし、Linuxマシンに.exeファイルをコピーする必要があります。その後、Linuxマシンにmonoをインストールして、次のコマンドを発行できます。

mono myprogram.exe
2
user3578181

複数の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は表示されませんでした。

2
lambzee

これは、バイナリがmuslなどのlibcではないlibc実装を使用している場合にも発生する可能性があります。最近では、Alpineベースのイメージを使用してDockerコンテナでlibcを使用してバイナリを実行しようとすると、この特定の問題が発生する可能性が高くなります。 libc実装は常に静的にリンクする必要があるため、つまり、理由によりバイナリに直接ビルドする必要があるため、両方の環境をサポートするためにバイナリ自体にできることは何もありません。

0
Zyl