web-dev-qa-db-ja.com

`/ lib`と` / lib64`があり、 `/ bin`しかないのはなぜですか?

私のラップトップでは:

$ cat /etc/issue  
Ubuntu 18.04 LTS \n \l

ライブラリーには2つの異なるフォルダーがありますx86およびx86_64

~$ ls -1 /  
bin
lib
lib64
sbin
...

なぜバイナリが1つのディレクトリしか存在しないのですか?

追伸Android=にも興味がありますが、答えが同じであることを願っています。

27
Gluttton

まず、/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なし)とは関係がないことに注意してください。デフォルトでは、もちろん手動でコンパイルおよびデプロイできます)。また、ディレクトリ構造は完全に異なります。

25

その理由は、lib/lib64ディレクトリには、たまたま同じnameを持つファイルが含まれている可能性があるためです。これらのファイルは、さまざまなプログラムで共有されるライブラリだからです。それらを別のディレクトリに配置すると、競合が解決されます。 (通常...)32/64ビットの同じ名前の実行可能ファイルを同じシステムに配布する正当な理由はありませんが、実行可能ファイルが混在している可能性があるため、共有ライブラリを用意する必要があります。

22
Thomas Dickey