Linux
 Computer >> コンピューター >  >> トラブルシューティング >> Linux

Ubuntuで「cannot execute binary file: Exec format error」を解決する方法

公式のapt-getリポジトリからソフトウェアをインストールしている限り、この問題に遭遇することはまずありません。しかし、インターネットからダウンロードしたプログラムを実行しようとすると、「bash: ./nameOfProgram: cannot execute binary file: Exec format error」という厄介なエラーが表示されることがあります。このエラーは、多くの場合「bash: ./nameOfProgram.sh: Permission denied」のようなメッセージとともに現れ、Ubuntuがダウンロードしたバイナリファイルと正しく連携できなかったことを意味します。原因は、そのファイルが一見有効なLinuxバイナリに見えても、実際にはお使いのカーネルが対応していない別のチップセット向けにビルドされているためです。

Ubuntuユーザーの大多数は、実際のメーカーに関わらず、Intelが策定した標準アーキテクチャに基づく32ビットまたは64ビットプロセッサを使用しています。ここで重要なのは、64ビットプロセッサは32ビットモードでも動作できるという点です。つまり、64ビットCPUを搭載しているのにこのエラーが出る場合は、32ビット版のUbuntuを実行している可能性があります。自分のチップがどのように動作しているかを確認するには、いくつかの簡単なコマンドを実行するだけで済みます。

方法1:archコマンドを使う

マシンに搭載されているマイクロプロセッサの種類がわからない場合は、まずコマンドラインからarchコマンドを実行しましょう。このコマンドの出力は1行だけです。多くの場合「i686」と表示され、これは32ビットプロセッサであることを示すため、x86_64向けバイナリは実行できません。逆に「amd64」などと表示されれば、x86_64プロセッサ上で動作しており、理論上はほとんどの32ビットおよび64ビットバイナリを実行できます。Microsoft Windowsとは異なり、Ubuntu Linuxには、64ビットチップセットのユーザーが16ビットWindowsプログラムをOS上で実行できるようにするツールが含まれていることもあります。

これらの用語は、実際にその特定モデルのチップを使っていなくても当てはまります。たとえばi686は、実際にはIntel 80686チップでなくても、Linuxが多くの32ビットプロセッサを指す際に使う名称です。また、64ビットのIntel技術を使っていても、archはプロセッサをamd64と呼ぶことがあります。これはエラーではないため、気にする必要はありません。cat /proc/cpuinfoやmore /proc/cpuinfoを実行すれば、使用しているプロセッサの正確な種類を確認できます。このファイルの行は長いため、グラフィカルなターミナルウィンドウを使っている場合は、コマンドを実行する前にF11キーで画面を最大化しておくとよいでしょう。仮想コンソールのユーザー、特にUbuntuサーバーを扱っている方は、それほど気にする必要はありません。

その他の出力が表示される場合もあります。それはソフトウェア実行の選択肢をさらに狭めるものです。Ubuntuは長い間PowerPCアーキテクチャをサポートしてきました。このアーキテクチャは一部のワークステーションのほか、クラシックMacintoshや古いOS X搭載Macにも搭載されています。現在でもこれらのアーキテクチャ向けのUbuntuリポジトリを見つけることはできますが、今日ではほとんどメンテナンスされていません。ただし、この場合、公式リポジトリ以外からダウンロードしたLinuxバイナリの多くは実行できない可能性が高いでしょう。だからといってUbuntuがこれらのマシンで動作しないわけではありませんが、より軽量なLubuntuディストリビューションを検討してみるのもよいかもしれません。

方法2:fileコマンドを使う

fileコマンドは、さまざまなファイルの中身を識別するもので、通常非常に正確です。「file nameOfProgram」と入力して問題のファイルを調べ、「ELF 32-bit」または「ELF 64-bit」という出力が得られるか確認してみてください。ELF 64-bitバイナリだと判定され、かつarchコマンドの出力がi686だった場合、そのプログラムをあなたのマシンで実行する合理的な方法はありません。64ビットマイクロプロセッサで32ビット版Ubuntuを動かしているなら、OSを再インストールすれば技術的には解決しますが、単一のプログラムのためだけにそこまでするのはやや極端な手段といえます。

また、ごくわずかな可能性ではありますが、マルウェアスキャンを実行済みのバイナリを実行しようとした際に、ターミナルに無意味な文字が大量に出力されるケースもあります。これらの文字は、菱形のブロック状に表示されるか、あるいは数値の入った四角い箱として現れます。後者はコンピュータ科学者の間で「豆腐(tofu)」と呼ばれ、現在インストールされているフォントでは表示できない文字のUnicode値を表しています。ターミナルがこのように表示している場合、それはフォントの問題でもマルウェアの仕業でもないので安心してください。これは単純に、バイナリ内にコンパイルされたマイクロプロセッサのオペコードがあなたのシステムにとってあまりに異質で、コードの一部を解釈する方法がわからないために起こる現象です。

最善の解決策は、自分のアーキテクチャに合ったパッケージをインストールすることです。Ubuntu内からパッケージをインストールするのであれば、apt-getシステムやグラフィカルなSynapticパッケージマネージャーが問題なく対応してくれます。他のディストリビューションからパッケージをダウンロードする場合は、自分のアーキテクチャに適したものを見つける必要があります。たとえばArch Linuxのgvimパッケージの一覧を見ると、デフォルトパッケージはx86_64アーキテクチャ向けですが、i686チップセット向けのものも用意されています。こちらはIntel割り込み構造に対応した32ビットマシンで動作します。ただし、i686と32ビットという用語は常に相互に包含関係にあるわけではなく、Linuxがサポートする他のチップセットにも独自の32ビット実装が存在することを忘れないでください。

GNU/Linuxの世界を広く探求していると、さらに特殊な技術向けにコンパイルされたバイナリに出会うこともあるでしょう。Linuxは真のクロスプラットフォーム環境であり、OpenRISC、MIPS、SPARC、M32R、MN103、ARM、ARC、Alphaなど、多数の規格向けにバイナリがコンパイルされています。おそらくこれらの大半は実行できないでしょうが、ARMはタブレットやスマートフォンで非常に人気の高いプラットフォームです。Raspberry PiもARMベースであるため、モバイルデバイスでUbuntuを動かしている場合や、Raspberry Pi向けのUbuntu MATEディストリビューションを使っている場合は、Intel 32ビットやx86_64向けではなく、これらのバイナリが必要になります。

著者について

Ubuntuで「cannot execute binary file: Exec format error」を解決する方法

Kevin Arrows(ケビン・アローズ)

Kevin Arrowsは、10年以上の業界経験を持つテクノロジースペシャリストです。Microsoft Certified Technology Specialist(MCTS)認定資格を保有し、最新の技術動向を追いかけることに強い情熱を注いでいます。ソフトウェア開発、サイバーセキュリティ、クラウドコンピューティングなど、幅広い技術トピックについて執筆しており、複雑な技術的概念を明快かつ簡潔に説明する能力で同業者から高い評価を得ています。

  1. Linuxで弱いWi-Fi電波を改善する方法:実証済みの4つのソフトウェア修正

    多くのLinuxユーザーにとって、Wi-Fi信号の安定性は大きな悩みの種です。残念ながら、この問題については誤った情報も少なくありません。「Linuxを使うと無線LANが使えなくなる」と思い込み、ディストリビューションの利用自体を避けてしまう人さえいます。しかし、それは事実とは異なります。Linuxで無線の受信感度を改善する方法は主に4つあり、いずれもソフトウェア(ドライバ)レベルの修正で対応可能です。 始める前のハードウェア確認 ソフトウェア側の対策に進む前に、物理的な接続状態を確認しておきましょう。ノートPCなどに内蔵されたWi-Fiカードを使用している場合は、カードがしっかりと装着されて

  2. Linux Wi-Fiをマスターする:ドライバー トラブルシューティング完全ガイド

    Linuxでは、Windowsなどの他のOSでは問題なく動作するWi-Fiアダプターでも、ドライバーの設定に手間取ることがあります。無線ネットワークアダプターが自動的に接続されない、あるいはGUI環境で接続アイコンを何度もクリックしなければならない――そんな経験はありませんか?多くの場合、原因はシステムがドライバーを十分な時間ポーリングしていないことにあります。 まずはお使いのハードウェア向けの最新ドライバーがインストールされているかを確認しましょう。それでも改善しない場合は、syslog(システムログ)を調べて異常な動作がないかチェックします。ドライバーが定期的にリセットを繰り返すケースもあ