bash: ./program: バイナリファイルを実行できません。実行形式エラー

プログラムを実行しようとしているのですが、次のようなエラーが発生します。

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

このエラーはどうすれば直りますか?

Ubuntu 14.04.2 (amd64)をVMwareで使用しています。Ubuntu i386でも試してみましたが、結果は同じでした。

質問へのコメント (1)

ARMアーキテクチャ用にコンパイルされた実行ファイルをx86-64アーキテクチャで動かそうとするのは、英語しか話せないプロセッサに中国語で指示を出せと頼むようなものです。

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

1.x86-64版の実行ファイルを入手する(どんな方法でも。もしx86-64版の実行ファイルを入手できないが、そのソースコードを入手できるのであれば、仮想マシン上で再コンパイルを試みることができます)。

2.Ubuntu 14.04.2 (amd64) の代わりに Ubuntu Server for ARM をインストールする。このためには、ARMアーキテクチャで動作する物理マシンか、それをエミュレートできる仮想化ソフトウェアが必要です。

解説 (0)

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

ある具体的な事例では、Visual Studio Codeをダウンロードし、Ubuntuのインストール上で実行しようとしましたが、このVMに32ビットのUbuntuをインストールしたことに気づきませんでした'。 このエラーが発生しましたが、32ビット版をダウンロードした後、問題なく実行できました。

解説 (0)

[binfmt-support]をインストールすると、amd64システムでARM実行可能画像を実行できることがよくあります。 ](https://apps.ubuntu.com/cat/applications/binfmt-support)、[qemu](https://apps.ubuntu.com/cat/applications/qemu)、および[qemu-user-static](https://apps.ubuntu.com/cat/applications/qemu-user-static)パッケージ:

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

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

解説 (1)

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

  • 実行ファイルはファイルではなく、リンクである
  • VM内で実行する
  • ファイルが共有フォルダにある
  • ホストがWindowsである。

そのファイルをアーカイブで入手した場合、仮想ドライブ内のディレクトリ(ホストマシンのハードドライブにマッピングされたフォルダではなく、例えば /myNewDir/ など)に解凍してみてください。

解説 (1)

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

mono myprogram.exe
解説 (0)

システムに複数の「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形式エラー」が表示されませんでした。

解説 (0)

これは、バイナリがmuslなどのlibcではないlibc実装を使用する場合にも発生する可能性があります。 最近では、この特定の問題は、高山に基づく画像を含むドッカーコンテナーでlibcを使用してバイナリを実行しようとしたときに発生する可能性が最も高いです。 libcの実装は常に静的にリンクする必要があるため、両方の環境をサポートするためにバイナリ自体にできることは何もありません。 理由により、バイナリに直接組み込まれています。

解説 (0)