GNU/Linux >> Linux の 問題 >  >> Linux

/lib と /lib64 があるのに /bin しかないのはなぜですか?

まず、なぜ別々の /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 ビットの同じシステム上に同じ名前の実行可能ファイルを配布する正当な理由はありませんが、実行可能ファイルが混在する可能性があるため、共有ライブラリを提供する必要があります。


Linux
  1. Linux – `/ dev/ptmx`と`/dev / pts / ptmx`がデバイスファイルではないのはなぜですか?

  2. 「難解な」(奇妙な)が、標準に準拠したCコンパイラまたはランタイムはありますか?

  3. コマンド`tty`の出力とファイル`/dev / tty`はどちらも、現在のBashプロセスの制御端末を参照していますか?

  1. Linux の共有ライブラリが実行可能であるのはなぜですか?

  2. 一部のシェル `read` ビルトインが `/proc` のファイルから行全体を読み取れないのはなぜですか?

  3. /etc/hosts と DNS はどのように連携してホスト名を IP アドレスに解決しますか?

  1. 現在の制御端末と`/dev / tty`の間にはどのような関係がありますか?

  2. ファイル記述子が開かれ、一度だけ読み取られるのはなぜですか?

  3. ファイルのコピーを 1 つだけ保持し、他のコピーは単なる参照であるファイルシステムはありますか?