プログラムを実行しようとしていますが、次のようなエラーが発生します。
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アーキテクチャ用にコンパイルされた実行可能ファイルを実行しようとしています。これは、英語のみを話すプロセッサに中国語で指示するように依頼することに似ています。
その実行可能ファイルを実行する必要がある場合、2つの選択肢があります。
X86-64バージョンの実行可能ファイルを取得します(どういうわけか、x86-64バージョンの実行可能ファイルを取得できないが、そのソースコードを取得できる場合は、仮想マシンで再コンパイルを試みることができます);
Ubuntu 14.04.2(AMD64)の代わりに ARM用Ubuntuサーバー をインストールします。これには、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
は、実行可能ファイルを実行するときにsyscallエミュレーションを実行します。これはほとんどのARMバイナリで機能しますが、いくつかは正しく動作しない可能性があります。
次のすべてに該当する場合、このようなエラーが発生する可能性があります。
そのファイルを取得した場合、たとえば、アーカイブで、VM内で、ホストマシンのハードドライブにマップされたフォルダーではなく、仮想ドライブ内のいくつかのディレクトリで、たとえば/myNewDir/
適切な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 format error
は表示されませんでした。
これは、バイナリがmuslなどのlibcではないlibc実装を使用している場合にも発生する可能性があります。最近では、Alpineベースのイメージを使用してDockerコンテナでlibcを使用してバイナリを実行しようとすると、この特定の問題が発生する可能性が高くなります。 libc実装は常に静的にリンクする必要があるため、つまり、理由によりバイナリに直接ビルドする必要があるため、両方の環境をサポートするためにバイナリ自体にできることは何もありません。