「/lib」と「/lib64」がありますが、「/bin」だけがあるのはなぜですか?

「/lib」と「/lib64」がありますが、「/bin」だけがあるのはなぜですか?

私のラップトップから:

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

x86ライブラリには2つのフォルダがありますx86_64

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

バイナリファイルが1つのディレクトリにのみ存在するのはなぜですか?

PS私もAndroidに興味がありますが、答えは同じだったらいいです。

答え1

/libまず、別の合計がある理由は次のとおりです/lib64

これファイルシステム階層標準 分離/lib/lib64存在が言及される理由は次のとおりです。

10.1別々のライブラリを必要とする複数のバイナリ形式をサポートするシステムでは、/ libディレクトリに1つ以上のバリエーションがある可能性があります。 (...)これは通常、複数のバイナリ形式をサポートしますが、同じ名前のライブラリを必要とするシステムで64ビットまたは32ビットのサポートに使用されます。この場合、/ lib32と/ lib64はライブラリディレクトリにすることができ、/ libはそれらの1つへのシンボリックリンクです。

たとえば、私のSlackware 14.2には32ビットライブラリと64ビットライブラリの別々のディレクトリがありますが、 /libFHSスニペットが提案するようにシンボリックリンクではありません。/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

とには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]

インタプリタの使命は、必要な共有ライブラリをロードすることです。ラッパーを使用して、バイナリを実行せずにロードするライブラリをGNUインタプリタに要求できますLD_TRACE_LOADED_OBJECTS=1ldd

$ 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/bin64$PATH

しかし、上記は単なる習慣に過ぎないことに注意してください。 Linuxカーネルは別の/bin/bin64。必要に応じてそれを作成し、それに応じてシステムを設定できます。

Androidについても言及しました。修正されたLinuxカーネルを実行する以外に、UbuntuなどのGNUシステムとは関係ありません。 glibcもなくbashもありません(デフォルトでは手動でコンパイルして配布できます)。ディレクトリ構造は次のとおりです。全く違います。

答え2

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

関連情報