私のラップトップでは:
$ cat /etc/issue
Ubuntu 18.04 LTS \n \l
ライブラリーには2つの異なるフォルダーがありますx86
およびx86_64
:
~$ ls -1 /
bin
lib
lib64
sbin
...
なぜバイナリが1つのディレクトリしか存在しないのですか?
追伸Android=にも興味がありますが、答えが同じであることを願っています。
まず、/lib
と/lib64
が別々になっている理由:
Filesystem Hierarchy Standard は、次の理由により、/lib
と/lib64
が別々に存在することに言及しています。
10.1別のライブラリを必要とする複数のバイナリ形式をサポートするシステムでは、/ libディレクトリの1つ以上のバリアントが存在する場合があります。 (...)これは、複数のバイナリ形式をサポートするシステムで64ビットまたは32ビットのサポートに一般的に使用されますが、同じ名前のライブラリが必要です。この場合、/ lib32と/ lib64はライブラリディレクトリで、/ libはそれらの1つへのシンボリックリンクです。
たとえば、私のSlackware 14.2では、/lib
はFHSスニペットが示唆するシンボリックリンクではありませんが、32ビットおよび64ビットライブラリ用の/lib64
および/lib
ディレクトリがあります。
$ 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
libc.so.6
と/lib
には、2つの/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
またはldd
ラッパーを使用してバイナリを実行しなくても、ロードするライブラリをGNUインタープリターに尋ねることができます。
$ 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
がない理由は、これらのディレクトリの両方に同じ名前のファイルがあった場合、それらの1つを間接的に呼び出すことができなかったためです。 /bin
の最初に/bin64
または$PATH
を付けます。
ただし、上記は慣例にすぎないことに注意してください。Linuxカーネルは、/bin
と/bin64
を別々に使用しても、実際には気にしません。それらが必要な場合は、それらを作成し、それに応じてシステムをセットアップできます。
また、Android-変更されたLinuxカーネルを実行する以外は、GNUシステム-glibcなし、bashなし)とは関係がないことに注意してください。デフォルトでは、もちろん手動でコンパイルおよびデプロイできます)。また、ディレクトリ構造は完全に異なります。
その理由は、lib/lib64ディレクトリには、たまたま同じnameを持つファイルが含まれている可能性があるためです。これらのファイルは、さまざまなプログラムで共有されるライブラリだからです。それらを別のディレクトリに配置すると、競合が解決されます。 (通常...)32/64ビットの同じ名前の実行可能ファイルを同じシステムに配布する正当な理由はありませんが、実行可能ファイルが混在している可能性があるため、共有ライブラリを用意する必要があります。