なぜ `/ lib`と` / lib64`があり、 `/ bin`しかありませんか?


27

私のラップトップで:

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

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

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

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

PS私もAndroidに興味がありますが、その答えが同じであることを願っています。


1
1つだけですか?私は両方を参照/binし、/sbinそこに。質問は何ですか?/libとの違いについて質問してい/lib64ますか?
クサラナナンダ

2
@Kusalananda、私は独立したフォルダがないことを意味しますx86_64(どちらの場合もそうではあり/binません/sbin)。
食いしん坊

7
IMO OPはなぜないのか知りたい/bin64です。
はArkadiusz Drabczyk

32ビットバージョンと64ビットバージョン(WINE)の両方を使用することでメリットが得られるおよそ1つのアプリケーションは、異なる名前のバイナリ(wine*32およびwine*64)を使用することで回避できます。
イグナシオバスケス-エイブラムス

1
@ IgnacioVazquez-Abrams:また、バイナリをライブラリにリンクすることを言っておく必要があります。したがって、バイナリを32/64ビットで分割する必要はありません。
smci

回答:


25

まず、なぜ別のもの/lib/lib64

ファイルシステム階層標準は、 その別個の言及/lib/lib64存在するため。

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

たとえば、Slackware 14.2には、FHSスニペットが示すようにシンボリックリンクではありませんが、 32ビットライブラリと64ビットライブラリのディレクトリ が/libあります。/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なし(デフォルトでは、もちろん手動でコンパイルしてデプロイできます)まったく違う。


あなたのls -l例は特に関係ありません。何だろう役に立つことの出力であるls -l /lib /lib64、おそらくことを示し、/libそれ自体がシンボリックリンクです。
クリリス

あなたは私のシステム上のシンボリックリンクls -ld/libはなく、という意味でしたSlackware 14.2
はArkadiusz Drabczyk

ライブラリには異なるmd5sumがあります:dfd029d25c58831bc5db671aec99a36f /lib64/libc.so.6987e7b736f316cc8da87ca2f38dae93e /lib/libc.so.6
はArkadiusz Drabczyk

2
その場合、ディレクトリ内のシンボリックリンクを表示しても引用にはつながりません。
クリリス

1
LD_TRACE_LOADED_OBJECTS = 1はセキュリティホールのために廃止され、lddはそれを使用しなくなりました。理由:システム管理者は、システム管理者がlddがそれを実行しないバイナリのみを参照することを期待していたため、ldd / path / to / malicious-static-binaryを使用してシステムを引き継ぎました。また、代わりに悪意のあるローダーを使用するようにバイナリを構築できるため、静的かどうかのチェックは不十分です。
ジョシュア

22

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.