まず、なぜ別々の /lib
があるのか そして /lib64
:
/lib
を分離するファイルシステム階層標準 そして /lib64
存在する理由:
10.1.個別のライブラリを必要とする複数のバイナリ形式をサポートするシステムには、/lib ディレクトリのバリアントが 1 つ以上存在する場合があります。 (...) これは、複数のバイナリ形式をサポートするシステムで 64 ビットまたは 32 ビットをサポートするために一般的に使用されますが、同じ名前のライブラリが必要です。この場合、/lib32 と /lib64 はライブラリ ディレクトリであり、/lib はそれらの 1 つへのシンボリック リンクです。
たとえば、私のSlackware 14.2には /lib
があります および /lib64
/lib
でも、それぞれ 32 ビット ライブラリと 64 ビット ライブラリのディレクトリ FHS スニペットが示唆するようなシンボリック リンクではありません:
$ ls -l /lib/libc.so.6
lrwxrwxrwx 1 root root 12 Aug 11 2016 /lib/libc.so.6 -> libc-2.23.so
$ ls -l /lib64/libc.so.6
lrwxrwxrwx 1 root root 12 Aug 11 2016 /lib64/libc.so.6 -> libc-2.23.so
2 つの libc.so.6
があります /lib
のライブラリ と /lib64
.
動的に構築された各 ELF バイナリには、インタープリターへのハードコーディングされたパスが含まれています。この場合は /lib/ld-linux.so.2
のいずれかです。 または /lib64/ld-linux-x86-64.so.2
:
$ file main
main: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, not stripped
$ readelf -a main | grep 'Requesting program interpreter'
[Requesting program interpreter: /lib/ld-linux.so.2]
$ file ./main64
./main64: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, not stripped
$ readelf -a main64 | grep 'Requesting program interpreter'
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
インタープリターの仕事は、必要な共有ライブラリーをロードすることです。 LD_TRACE_LOADED_OBJECTS=1
を使用してバイナリを実行しなくても、どのライブラリをロードするかを GNU インタープリターに問い合わせることができます。 または ldd
ラッパー:
$ LD_TRACE_LOADED_OBJECTS=1 ./main
linux-gate.so.1 (0xf77a9000)
libc.so.6 => /lib/libc.so.6 (0xf760e000)
/lib/ld-linux.so.2 (0xf77aa000)
$ LD_TRACE_LOADED_OBJECTS=1 ./main64
linux-vdso.so.1 (0x00007ffd535b3000)
libc.so.6 => /lib64/libc.so.6 (0x00007f56830b3000)
/lib64/ld-linux-x86-64.so.2 (0x00007f568347c000)
ご覧のように、特定のインタープリターはライブラリを探す場所を正確に認識しています - 32 ビット バージョンは /lib
でライブラリを探します 64 ビット版は /lib64
のライブラリを探します .
FHS 規格では、/bin
について次のように述べています。 :
/bin には、システム管理者とユーザーの両方が使用できるコマンドが含まれていますが、他のファイルシステムがマウントされていない場合 (シングルユーザーモードなど) に必要です。スクリプトによって間接的に使用されるコマンドも含まれる場合があります。
IMO 別の /bin
がない理由 と /bin64
つまり、これらのディレクトリの両方に同じ名前のファイルがある場合、 /bin
を配置する必要があるため、そのうちの 1 つを直接呼び出すことはできません。 または /bin64
最初の $PATH
.
ただし、上記は単なる慣例であることに注意してください。Linuxkernel は、別の /bin
を使用してもあまり気にしません。 と /bin64
.必要に応じて、それらを作成し、それに応じてシステムをセットアップできます。
Androidについても言及しました-変更されたLinuxカーネルを実行することを除いて、UbuntuなどのGNUシステムとは何の関係もないことに注意してください-glibcもbashもありません(デフォルトでは、もちろん手動でコンパイルして展開できます)、ディレクトリ構造も完全に異なります.
その理由は、lib/lib64 ディレクトリにたまたま同じ name を持つファイルが含まれている可能性があるためです。 それらはさまざまなプログラムで共有されるライブラリであるためです。それらを別々のディレクトリに置くと、競合が解決します。 (通常...) 32/64 ビットの同じシステム上に同じ名前の実行可能ファイルを配布する正当な理由はありませんが、実行可能ファイルが混在する可能性があるため、共有ライブラリを提供する必要があります。