私のラップトップから:
$ 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ビットライブラリの別々のディレクトリがありますが、
/lib
FHSスニペットが提案するようにシンボリックリンクではありません。/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=1
。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
/bin64
$PATH
しかし、上記は単なる習慣に過ぎないことに注意してください。 Linuxカーネルは別の/bin
と/bin64
。必要に応じてそれを作成し、それに応じてシステムを設定できます。
Androidについても言及しました。修正されたLinuxカーネルを実行する以外に、UbuntuなどのGNUシステムとは関係ありません。 glibcもなくbashもありません(デフォルトでは手動でコンパイルして配布できます)。ディレクトリ構造は次のとおりです。全く違います。
答え2
その理由は、lib / lib64ディレクトリに偶然同じファイルが含まれる可能性があるためです。名前なぜなら、これらは他のプログラムと共有されるライブラリであるからです。別のディレクトリに配置すると、競合が解決されます。 (通常...)同じ32/64ビットシステムに同じ名前の実行可能ファイルを配布する理由はありませんが、混合実行可能ファイルがある可能性があるため、共有ライブラリを提供する必要があります。