了解ldd输出

时间:2011-04-05 15:26:27

标签: linker ldd

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)

2 个答案:

答案 0 :(得分: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如何在动态部分中存储信息的附加列。但是你可以看到libc.so.6由于SONAME而被.6后缀硬编码

甚至不了解ELF文件格式:

$ strings /bin/echo |grep libc.so
libc.so.6

要查找链接器如何查找库(在编译的最后一步完成),请使用gcc选项-Wl,--verbose(这要求gcc将选项--verbose传递给{{ 1}}):

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 后缀一无所知,只是迭代尝试打开.digitlibLIBNAME.so的所有库搜索目录,其中LIBNAME是{{1}之后的字符串} 选项。 (默认情况下会添加libLIBNAME.a选项。)

首先成功的是-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.solibc.so.6等某个版本的符号链接,lib___.so中填写了SONAME字段,表示lib___.so.3.4.5链接不到{{1}但是lib___.so.3.4.5ld的另一个符号链接。 lib___.so名称将记录在二进制的NEEDED字段中。

答案 1 :(得分: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 union有效,并查找由DT_STRTAB表中的thi union成员指定的偏移量,以查找此二进制文件/ SO所依赖的库的名称。