Ubuntuで「バイナリファイルを実行できません:Execフォーマットエラー」を修正する方法



問題を排除するために楽器を試してください

公式のapt-getリポジトリを使用している場合は発生しないはずですが、インターネットからソフトウェアをダウンロードして実行すると、恐ろしいものが表示される可能性があります。 bash:./ nameOfProgram:バイナリファイルを実行できません:Exec形式エラー 。このエラーは、通常、その後に続きます bash:./ nameOfProgram.sh:アクセスが拒否されました またはそのようなものは、Ubuntuがダウンロードしたバイナリと正しくインターフェースできなかったことを示します。これは、明らかに有効なLinuxバイナリですが、カーネルが現在サポートしているものとは異なるチップセット用に設計されているためです。



Ubuntuを使用しているほとんどの人は、実際にマイクロチップを作成した人に関係なく、Intelがリリースした標準アーキテクチャに基づく32ビットまたは64ビットプロセッサを使用しています。 64ビットプロセッサは32ビットモードで実行できることを覚えておくことが重要です。したがって、64ビットプロセッサを使用していてもこのエラーが発生する場合は、32ビットバージョンのUbuntuを実行している可能性があります。チップがどのように動作しているかを知るために必要なのは、いくつかの簡単なコマンドだけです。



方法1:archコマンドを使用する

マシンにインストールしたマイクロプロセッサの種類に慣れていない場合は、最初にコマンドラインからarchコマンドを使用することをお勧めします。このコマンドを実行すると、1行の出力のみが返されます。多くの場合、i686が表示されます。これは、32ビットプロセッサを使用しているため、x86_64バイナリを実行できないことを意味します。代わりにamd64などが表示される場合は、x86_64プロセッサを使用しており、少なくとも理論的にはほとんどの32ビットおよび64ビットバイナリを実行できるはずです。 Microsoft Windowsとは異なり、Ubuntu Linuxには実際には、644ビットチップセットのユーザーがオペレーティングシステムで16ビットWindowsプログラムを実行できるようにするための適切なツールが含まれています。



これらの用語は、その特定のモデルのマイクロチップを実際に使用していなくても当てはまります。たとえば、i686は、実際にはIntel 80686チップでなくても、Linuxが多くの32ビットプロセッサを参照する方法です。 64ビットのIntelテクノロジを使用している場合でも、archはプロセッサをamd64チップと呼ぶ場合があります。これはエラーを示すものではなく、無視しても問題ありません。あなたは猫を使うことができます / proc / cpuinfo 以上 / proc / cpuinfo 使用しているプロセッサの正確なタイプを確認します。このファイルの行は長いため、グラフィカルターミナルウィンドウを使用している場合は、発行する前にF11を押すことをお勧めします。仮想コンソールのユーザー、特にUbuntuサーバーを使用しているユーザーは、それほど心配する必要はありません。

他の種類の出力が表示される場合があります。これにより、ソフトウェアの実行に関してオプションがさらに制限される場合があります。 UbuntuはPowerPCアーキテクチャを最も長い間サポートしていました。これは、一部のワークステーションだけでなく、多くのClassicMacintoshおよび古いOSXMacintoshマシンにも見られます。現在でもほとんどサポートされていませんが、実際にはこれらのアーキテクチャ用のUbuntuリポジトリを見つけることができます。ただし、この場合、公式リポジトリの外部でインターネットからダウンロードした多くのLinuxバイナリを実行できない可能性があります。これは、Ubuntuがこれらのマシンで動作しないという意味ではありませんが、より軽いLubuntuディストリビューションを検討することをお勧めします。

方法2:ファイルコマンドを使用する

fileコマンドは、さまざまなファイルに含まれるものを識別し、通常は非常に正確です。 fileと入力して、問題のファイルを特定してみてください nameOfProgram ELF32ビットまたはELF64ビットのどちらを出力として取得するかを確認します。 ELF 64ビットバイナリであり、archコマンドからの出力としてi686を受け取ったことが示されている場合は、マシン上で合理的に実行する方法はありません。 32ビットUbuntuを実行している64ビットマイクロプロセッサを使用している場合は、オペレーティングシステムを技術的に再インストールできますが、これは単一のプログラムを実行するための少し極端な手順です。



わずかではありますが、マルウェアスキャンを実行した場合でも、実行しようとするとジャンク文字が端末に吐き出されるバイナリに遭遇する可能性も非常に現実的です。これらの文字は通常、ひし形のブロック、または数値が含まれる長方形の立方体のいずれかの形式を取ります。一部のコンピューター科学者は後者を豆腐と呼び、現在インストールされている書体では表示できない文字のUnicode値を表します。端末がこのように表示している場合、これはフォントエラーでも、マルウェアとの関係でもないので安心できます。むしろ、これは単に、バイナリ内のコンパイルされたマイクロプロセッサオペコードがシステムにとって非常に異質であるため、コードの一部を解釈する方法がわからないためです。

これを修正する最善の方法は、アーキテクチャに適したパッケージをインストールすることです。 Ubuntu内からパッケージをインストールする場合は、apt-getシステムまたはグラフィカルSynapticマネージャーで問題なくカバーできます。別のディストリビューションからパッケージをダウンロードする場合は、アーキテクチャに適したパッケージを見つける必要があります。たとえば、ArchLinuxのgvimパッケージのリストを見てください。デフォルトのパッケージはx86_64アーキテクチャを備えていますが、i686チップセット用のパッケージもあります。これは、Intel割り込み構造で動作する32ビットマシンで動作しますが、Linuxがサポートする他のチップセットは実際には独自の32ビット実装を備えているため、i686と32ビットという用語は常に相互に包括的ではないことに注意してください。

GNU / Linuxシーン全体を探索しているユーザーは、これらよりもはるかにエキゾチックなテクノロジー用にコンパイルされたバイナリに出くわす可能性があります。 Linuxは本当にクロスプラットフォームのコードシーンであるため、OpenRISC、MIPS、SPARC、M32R、MN103、ARM、ARC、Alpha、およびその他の多くの標準バイナリがコンパイルされて動作することがわかります。 ARMは非常に人気のあるタブレットとスマートフォンのプラットフォームですが、おそらくこれらのいずれも実行できません。これは、Raspberry Piのベースとなるプラットフォームでもあります。つまり、実際にモバイルデバイスでUbuntuを実行している場合、またはRaspberryPiのUbuntuMATEディストリビューションを実行している場合は、Intel32ビットまたはx86_64バイナリの代わりにこれらが実際に必要になります。

読んだ4分