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


92

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

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


4
ARM実行可能ファイルです。つまり、間違った実行可能形式をダウンロードしたか、間違ったプラットフォーム用にコンパイルしました。適切な実行可能ファイルを取得するか、再コンパイルする必要があります。
カールリヒター

回答:


77

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

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

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

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


23

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

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


8

binfmt-supportbinfmt-supportをインストールしますqemuqemuをインストールする、およびqemu-user-staticqemu-user-staticをインストールしますパッケージをインストールすると、amd64システムでARM実行可能イメージを実行できる場合がよくあります。

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

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


須藤はapt-getをインストールbinfmt支援QEMUはQEMU-ユーザー静的
Mominアルアジズ

7

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

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

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


それはとても役に立ちます。私にとっては、その実行可能ファイルへのショートカット(リンク)を作成し、ショートカットを実行するとエラーが発生しました。
ドク・トラン

2

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

mono myprogram.exe

2

複数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


0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.