13

に依存していることをどのようにldd知るのですlibc.so.6か?libc.so.5libc.so.7

libc.so.6 => /lib64/libc.so.6 (0x00000034f4000000)
/lib64/ld-linux-x86-64.so.2 (0x00000034f3c00000)
4

2 に答える 2

17

これは、アプリケーションバイナリ自体の内部に記録されます(コンパイル時、より正確にはリンクステップで指定され、で実行されます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にオプションを渡すように要求します--verboseld

$ 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.5SONAMEフィールドが入力されています。名前はバイナリのNEEDEDフィールドに記録されます。lib___.so.3.4.5ldlib___.solib___.so.3.4lib___.so.3.4.5.3.4

于 2011-04-05T15:34:25.453 に答える
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 が依存するライブラリの名前を見つけます。

于 2012-04-05T22:40:44.883 に答える