に依存していることをどのようにldd
知るのですlibc.so.6
か?libc.so.5
libc.so.7
libc.so.6 => /lib64/libc.so.6 (0x00000034f4000000)
/lib64/ld-linux-x86-64.so.2 (0x00000034f3c00000)
これは、アプリケーションバイナリ自体の内部に記録されます(コンパイル時、より正確にはリンクステップで指定され、で実行されますld
)。
$ readelf -d /bin/echo
Dynamic section at offset 0x5f1c contains 21 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libc.so.6]
...
(elfが動的セクションに情報を格納する方法については、いくつかの追加の列があります。ただし、 SONAME.6
のため、libc.so.6がサフィックスでハードコーディングされていることがわかります)
または、ELFファイル形式の知識がなくても:
$ strings /bin/echo |grep libc.so
libc.so.6
見つけるには、リンカはどのようにしてライブラリを見つけますか(コンパイルの最終ステップで行われます)、gcc
オプションを使用します-Wl,--verbose
(これはgccにオプションを渡すように要求します--verbose
)ld
:
$ gcc a.c -Wl,--verbose
...
attempt to open /usr/lib/gcc/i686-pc-linux-gnu/4.4.4/libc.so failed
attempt to open /usr/lib/gcc/i686-pc-linux-gnu/4.4.4/libc.a failed
attempt to open /usr/lib/gcc/i686-pc-linux-gnu/4.4.4/libc.so failed
attempt to open /usr/lib/gcc/i686-pc-linux-gnu/4.4.4/libc.a failed
attempt to open /usr/lib/gcc/i686-pc-linux-gnu/4.4.4/../../../libc.so succeeded
opened script file /usr/lib/gcc/i686-pc-linux-gnu/4.4.4/../../../libc.so
opened script file /usr/lib/gcc/i686-pc-linux-gnu/4.4.4/../../../libc.so
attempt to open /lib/libc.so.6 succeeded
/lib/libc.so.6
リンカはサフィックスについて何も知りません。.digit
ライブラリ検索ディレクトリをすべて繰り返して、andを開こうとしlibLIBNAME.so
ます。libLIBNAME.a
ここで、LIBNAMEは-l
オプションの後の文字列です。(-lc
オプションはデフォルトで追加されます)。
最初の成功は/usr/lib/libc.so
、それ自体がライブラリではなく、リンカースクリプト(テキストファイル)であるということです。libc.so
典型的なスクリプトの内容は次のとおりです。
$ cat /usr/lib/libc.so
/* GNU ld script
Use the shared library, but some functions are only in
the static library, so try that secondarily. */
OUTPUT_FORMAT(elf32-i386)
GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.2 ) )
したがって、スクリプト/usr/lib/libc.so
は実際のライブラリよりも早く検出され、このスクリプトは、libc.so.6
この場合、どのファイルがリンクされるかを示します。
より一般的なケースでlib___.so
は、はのようなバージョンへのシンボリックリンクであり、リンクするのではなく、への別のシンボリックリンクであると言うlib___.so.3.4.5
SONAMEフィールドが入力されています。名前はバイナリのNEEDEDフィールドに記録されます。lib___.so.3.4.5
ld
lib___.so
lib___.so.3.4
lib___.so.3.4.5
.3.4
http://www.sco.com/developers/gabi/latest/ch5.dynamic.html#dynamic_section
各動的タグの意味があります。1 は、DT_NEEDED タグであることを示します。この場合、
typedef struct {
Elf32_Sword d_tag;
union {
Elf32_Word d_val;
Elf32_Addr d_ptr;
} d_un;
} Elf32_Dyn;
構造体には有効な d_val ユニオンがあり、DT_STRTAB テーブル内のユニオン メンバーによって指定されたオフセットを調べて、このバイナリ/SO が依存するライブラリの名前を見つけます。