さまざまな `libc.so`の違いと接続は何ですか?

さまざまな `libc.so`の違いと接続は何ですか?

Lubntu 18.04から

$ whereis libc
libc: /usr/lib/x86_64-linux-gnu/libc.a /usr/lib/x86_64-linux-gnu/libc.so /usr/share/man/man7/libc.7.gz

$ locate libc.so
/lib/i386-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so

$ ls -li /usr/lib/x86_64-linux-gnu/libc.so  /lib/x86_64-linux-gnu/libc.so.6 /lib/i386-linux-gnu/libc.so.6
 2101838 lrwxrwxrwx 1 root root  12 Apr 16 16:14 /lib/i386-linux-gnu/libc.so.6 -> libc-2.27.so
 2101796 lrwxrwxrwx 1 root root  12 May 13 20:09 /lib/x86_64-linux-gnu/libc.so.6 -> libc-2.27.so
15736469 -rw-r--r-- 1 root root 298 Apr 16 16:14 /usr/lib/x86_64-linux-gnu/libc.so

それらの違いと関連性は何ですかlibc.so

どちらが使われていますか?

ありがとうございます。

私の質問は以下から来ています。https://stackoverflow.com/questions/50798907/why-does-loading-the-libc-shared-library-have-libraryloader-object-is-not-cal

ありがとうございます。

答え1

彼らはすべて異なる目的を持っています:

  • /lib/i386-linux-gnu/libc.so.632ビット実行可能ファイルの実行に使用される32ビットx86 Cライブラリへのシンボリックリンク。
  • /lib/x86_64-linux-gnu/libc.so.664ビット実行可能ファイルの実行に使用される64ビットx86 Cライブラリへのシンボリックリンク。
  • /usr/lib/x86_64-linux-gnu/libc.so(通常)64ビットCライブラリ(該当する場合は動的または共有)を指すリンカスクリプト協会64ビット実行ファイル(ビルド時)

プログラムの構築と実行には3種類のリンクがあります。

  • 静的リンク:ビルドタイムリンカ(ld)は、ビルド中にプログラムで使用されたすべてのオブジェクトを解析し、使用されたオブジェクトをマージし、外部ライブラリを使用しない実行可能なバイナリを生成します。
  • ビルド時に動的リンク:ldプログラムで使用されているすべてのオブジェクトを確認しますが、実行可能ファイルに保存せずにそのオブジェクトへの参照のみを保存します。
  • ランタイムダイナミックリンカ:ランタイムリンカ(ld.so)またはダイナミックリンカは、実行可能ファイルに保存されているすべての参照を確認し、必要なすべてのライブラリをロードし、プログラムを実行する前にすべてのオブジェクト参照を更新します。

リンカスクリプト形式でlibc.so提供されるリンカスクリプトディレクティブ:ld

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib/x86_64-linux-gnu/libc.so.6 /usr/lib/x86_64-linux-gnu/libc_nonshared.a  AS_NEEDED ( /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 ) )

通常、ダイナミックライブラリはシンボリックリンクを使用して単純に設定されます(libfoo.soこれは使用されているすべてをld指し、通常は現在インストールされているライブラリのバージョンを指すシンボリックリンクです)。libfoo.so.1ld.so例えば libfoo.so.1.2.3)。 GNU Cライブラリの場合、動的にリンクされたプログラムにはまだ静的ライブラリの一部のシンボルが必要ですが、リンカが両方を試すことができるように、代わりにリンカスクリプトが使用されます。リンカスクリプトは、/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2実行可能ファイルに名前が含まれているランタイムに使用される動的リンカを参照します(上記).interp

「ダイナミックリンカー」と「ダイナミックローダー」という用語は同義語であり、互いに置き換えて使用できます(参照:ld.soマンページ)。

関連情報