ゲーム(Shank)をダウンロードしましたが、binファイルが実行されません。実行可能ファイルを起動しようとすると表示されるエラーは次のとおりです。
bash: ./shank-linux-120720110-1-bin: No such file or directory
おそらく、32ビットサポートがインストールされていない64ビットシステムで32ビットバイナリを実行しようとしています。
「No such file or directory」というメッセージが表示される場合が3つあります。
file shank-linux-120720110-1-bin
は「ELF 32-bit LSB executable…」のようなものを表示します)、それでも実行しようとすると、ファイルが存在しないことが通知されます。この最後のケースのエラーメッセージは明らかに紛らわしいです。あなたが言っていることは、プログラムを実行するために必要なランタイム環境の重要なコンポーネントが欠落しているということです。残念ながら、エラーが報告されるチャネルにはエラーコードのスペースのみがあり、実際に原因となるのはランタイム環境であるという追加情報のためのスペースはありません。この説明のテクニカルバージョンが必要な場合は、 64ビットシステムで32ビットバイナリを実行しているときに「Not found」メッセージが表示される をお読みください。
file
コマンドは、このバイナリが何であるかを示します。いくつかの例外を除き、Ubuntuのリリースが対象としているプロセッサアーキテクチャのバイナリのみを実行できます。主な例外は、64ビット(AMD64、別名x86_64)システムで32ビット(x86、別名IA32)バイナリを実行できることです。
11.04までのUbuntuでは、64ビットインストールで32ビットバイナリを実行するには、install ia32-libs
package 。追加のライブラリをインストールする必要がある場合があります(インストールすると、明示的なエラーメッセージが表示されます)。
11.10(oneiric)で multiarch サポートが導入されたため、ia32-libs
をインストールできますが、よりきめの細かいアプローチを選択できます。libc6-i386
= (およびその他の必要なライブラリ)。
file file-name
の出力が表示される場合にのみ、この回答に従ってください。
file-name: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped
64ビットのマルチアーキテクチャUbuntuシステムで32ビットの実行可能ファイルを実行するには、i386
アーキテクチャを追加する必要があり、libc6:i386
、libncurses5:i386
、libstdc++6:i386
これら3つをインストールする必要がありますライブラリパッケージ。
Sudo dpkg --add-architecture i386
Sudo apt-get update
Sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name
32ビットのdebをインストールすることで、(ia32-libsとlibc6に加えて)一部のライブラリが不足していることに気付きました。私は最初にこのコマンドを与えることでこの問題を解決しました:
Sudo apt-get install -f
その後、別のエラーが発生しました:
Message: SDL_GL_LoadLibrary
Error: Failed loading libGL.so.1
明らかに、これらのライブラリは適切にインストールされました。詳細に入ることなく、手作業でライブラリをリンクする必要がありました。それから、Synapticが次のパッケージをインストールすることで、より簡単なソリューションになることにも気付きました。
libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.
その後、次の問題は再生中の黒い画面で、/ Shank/binの実行可能ファイルを次のように置き換えることで解決しました。 http://treefort.icculus.org/smb/smb-linux-mesa-hotfix -test.tar.bz2 。
それが誰かに役立つことを願っています。さらにヘルプや詳細が必要な場合は、お気軽にお問い合わせください。
問題の性質と、Ubuntu 16.04の時点での修正方法についてもう少し詳しく示したトランスクリプトです。 file
は「動的リンク」を報告しますが、ldd
は「動的実行可能ファイルではない」を報告します。
$ ./myprogram
bash: myprogram: No such file or directory
$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped
$ ldd myprogram
not a dynamic executable
Libc6:i386をインストールすると、改善が始まります...
$ Sudo apt-get install libc6:i386 # the initial fix
...
$ ldd myprogram
linux-gate.so.1 => (0xf77fd000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
/lib/ld-linux.so.2 (0x56578000)
$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory
ジョブを完了するには、追加のライブラリを1つずつ特定してインストールする必要がある場合があります...
$ Sudo apt-get install libstdc++6:i386 ## may require various additional libs
$ ./myprogram
... works correctly ...
インストールする正しいライブラリを特定する体系的な方法があるかどうかはわかりません。エラーメッセージをパッケージ名にマッピングする推測作業が少しあります(タブ補完が役立ちます)。
@Gillesの回答を拡張するには、少なくとも3つのシナリオがあり、このエラーが発生します。
file
コマンドが機能する)、不可解なエラーメッセージが作成されます。これは、ローダーに問題があることを意味する場合があります。ローダーの問題のカテゴリー:
実行可能ファイルのローダーが存在しません。 fileコマンドを使用してこれを確認し、ローダーが存在するかどうかを確認できます。例えば。
file lmgrd
lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
interpreter /lib64/ld-lsb-x86-64.so.3
;に注意してください。このファイルが存在しない場合は、インストールする必要があります。 16.04のこの特定のローダーの場合、答えは Sudo apt-get install lsb
でした。
スクリプトのローダーの問題( this answer を参照)。
ldd <file-name>
を使用して、「見つからない」ライブラリを確認します。詳細については、 この回答 を参照してください。存在しないローダーは、32/64ビットの不一致またはその他の理由が原因である可能性があります。私が知らない他の種類のローダーエラーがあるかもしれません。