1. 概要

インターネットからダウンロードしたり、自分で作成したアプリケーションをインストールまたは実行したい場合、「ELFインタープリターが正しくありません:そのようなファイルやディレクトリはありません」というエラーが表示されることがあります。 このチュートリアルでは、エラーの原因を追跡して解決しようとします。

64ビットマシンで実行されている64ビットDebian10.10(Buster)および64ビットCentOS8.3.2011でコードをテストしました。

2. 問題の紹介

この問題は通常、64ビットオペレーティングシステムで32ビットアプリケーションを実行しようとすると発生します

$ ./binaryfile
bash: ./binaryfile: No such file or directory

他の一部のLinuxディストリビューション(CentOSなど)では、より意味のあるエラーメッセージが表示される場合があります。

$ ./binaryfile
ERROR: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory

または、次のように表示される場合があります。

$ ./binaryfile
ERROR: /lib64/ld-lsb-x86-64.so.3: bad ELF interpreter: No such file or directory

readelf を使用して、アプリケーションが32ビットアプリケーションであるかどうかを確認できます。

$ readelf -a binaryfile | grep ELF
ELF Header:
    Class:                           ELF32

アプリケーションが32ビットアプリケーションの場合、ELFヘッダーClass属性はELF32と表示され、ELF64と表示されます。 ]64ビットアプリケーションの場合。

「不正なELFインタープリター」エラーの原因は、通常、オペレーティングシステムに32ビットアプリケーションを実行するためのサポートライブラリがないため、それらをインストールする必要があるためです。

3. 32ビットアプリケーション用のサポートライブラリのインストール

「エラー:/lib/ld-linux.so.2:不正なELFインタープリター:そのようなファイルまたはディレクトリはありません」と表示されている場合、 ld-linux.soは、の一部であるELFダイナミックリンカーまたはローダーです。アプリケーションに必要な共有ライブラリをロードしてリンクするオペレーティングシステム。

OSがローダーを見つけられないため、ローダーを含むパッケージをインストールしますが、最初にパッケージ名を見つける必要があります。

3.1. パッケージ名の検索

CentOS を使用している場合は、次を実行できます。

$ sudo yum provides ld-linux.so.2
Last metadata expiration check: 0:51:38 ago on Sun 29 Aug 2021 10:14:19 PM UTC.
glibc-2.28-151.el8.i686 : The GNU libc libraries
Repo : @System
Matched from:
Provide : ld-linux.so.2

glibc-2.28-151.el8.i686 : The GNU libc libraries
Repo : baseos
Matched from:
Provide : ld-linux.so.2

パッケージ名はglibc-2.28-151.el8.i686です。

または、 Debian を使用している場合は、最初に apt-file という小さなユーティリティをインストールしてから、そのデータベースをダウンロードする必要があります。

$ sudo apt-get install apt-file && apt-file update
$ sudo apt-file find ld-linux.so.2
libc6-i386: /lib/ld-linux.so.2
libc6-i386: /lib32/ld-linux.so.2
...

パッケージ名はlibc-i386です。

3.2. パッケージのインストール

CentOSでdnfinstallを使用してパックをインストールできます。

$ sudo dnf install glibc.i686

また、Debianでは、 apt-getinstallを使用できます。

$ sudo apt-get install libc6-i386

パッケージをインストールしたら、アプリケーションの再実行を試みることができます。

$ ./binaryfile
./binaryfile: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

エラーは、共有ライブラリlibstdc++。so.6が見つからないことを示しています。

次のセクションでは、依存関係ライブラリをトレースしてインストールします。

4. 依存関係の問題の解決

不足しているライブラリをビルドまたはダウンロードして、アプリケーションが見つけることができるディレクトリに配置できます。たとえば、アプリケーションが存在するのと同じディレクトリ、またはPATH変数のディレクトリの1つに配置できます。 その後、アプリケーションの再実行を試みることができます。

$ ./binaryfile
./binaryfile: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory

エラーは、別の共有ライブラリが見つからないことを示しています。

すべてのライブラリが見つかるまでこのプロセスを繰り返し続けることができますが、 readelfツールを使用して、アプリケーションに必要なすべてのライブラリを一覧表示しましょう

$ readelf -a binaryfile | grep NEEDED
0x00000001 (NEEDED) Shared library: [libpthread.so.0]
0x00000001 (NEEDED) Shared library: [libstdc++.so.6]
...
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]

前のセクションの最初のパッケージで行ったように、アプリケーションが必要とするライブラリを含むすべてのパッケージを見つけてインストールできます。

5. 結論

「不正なELFインタープリター:そのようなファイルまたはディレクトリはありません」というエラーは通常、64ビットオペレーティングシステムで32ビットアプリケーションを実行しようとしたが、OSに32ビットアプリケーションを実行するためのサポートライブラリがないために発生します。 この問題を解決するには、64ビットOSが32ビットアプリケーションを実行するために必要なパッケージをダウンロードしてインストールする必要があります。