プログラムを実行しようとしているのですが、次のようなエラーが発生します。
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でも試してみましたが、結果は同じでした。
ARMアーキテクチャ用にコンパイルされた実行ファイルをx86-64アーキテクチャで動かそうとするのは、英語しか話せないプロセッサに中国語で指示を出せと頼むようなものです。
その実行ファイルを実行する必要がある場合、2つの選択肢があります。
1.x86-64版の実行ファイルを入手する(どんな方法でも。もしx86-64版の実行ファイルを入手できないが、そのソースコードを入手できるのであれば、仮想マシン上で再コンパイルを試みることができます)。
2.Ubuntu 14.04.2 (amd64) の代わりに Ubuntu Server for ARM をインストールする。このためには、ARMアーキテクチャで動作する物理マシンか、それをエミュレートできる仮想化ソフトウェアが必要です。
[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バイナリで機能しますが、正しく実行されない可能性があるものもあります。
適切なCPUアーキテクチャ(x86など)を使用してファイルをコンパイルし、Linuxマシンで.exeファイルをコピーする必要があります。 次に、Linuxマシンにmonoをインストールして、次のコマンドを発行できます。
mono myprogram.exe
システムに複数の「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形式エラー」が表示されませんでした。