Linker 了解ldd输出

Linker 了解ldd输出,linker,ldd,Linker,Ldd,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完成): (关于elf如何在动态部分存储信息,还有一些附加列。但是您可以看到libc.so.6是用.6后缀硬编码的,因为

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
完成):

(关于elf如何在动态部分存储信息,还有一些附加列。但是您可以看到libc.so.6是用
.6
后缀硬编码的,因为)

甚至在不了解ELF文件格式的情况下:

$ strings /bin/echo |grep libc.so
libc.so.6
要查找,链接器如何查找库(在编译的最后一步完成),请使用
gcc
选项
-Wl,--verbose
(这要求gcc将选项
--verbose
传递到
ld
):

链接器不知道任何关于
.digit
后缀的信息,它只是在试图打开
libLIBNAME.so
libLIBNAME.a
的所有库搜索目录上进行迭代,其中LIBNAME是
-l
选项后面的字符串。(
-lc
选项默认添加)

第一个成功是
/usr/lib/libc。因此
本身不是一个库,而是一个链接器脚本(文本文件)。下面是典型的
libc的内容。所以
script:

$ 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\uuuuuuuuuo.so
是一些版本的符号链接,比如
lib\uuuuuuuo.3.4
,还有一个SONAME字段填充在
lib\uuuuuuuuo.so.3.5
中,它指向
ld
链接不是指向
lib\uuuuuuuuuuuo.so
,而是指向
lib\uuuuuuuuuo.3.4.4
.3.4
名称将记录在所需的二进制字段中。

具有每个动态标记的含义。1表示它是DT_所需的标记,在本例中表示

typedef struct {
    Elf32_Sword d_tag;
    union {
        Elf32_Word  d_val;
        Elf32_Addr  d_ptr;
    } d_un;
} Elf32_Dyn;

结构具有有效的d_val union,并在DT_STRTAB表中查找该union成员指定的偏移量,以查找此二进制/SO所依赖的库的名称。

什么是
0x00000001(需要)
意思?是否
ldconfig
libc.SO.6
链接到最新版本的
libc.SO.6.x
,并将
lib.so
链接到最新版本的
libc.so.x
?假设
lib.so
链接到
lib.so.7
,那么由
gcc-l lib.so…
生成的二进制文件将依赖于
lib.so.7
,对吗?+1来编辑您的答案以包含如此多有用的信息。这是一篇经典的SO帖子。谢谢。@osgx,你最初是如何打开链接器脚本的?@compile fan,在我的机器上
/usr/lib/libc。所以
是一个文本文件,所以我用cat打开了它。在我们的机器上,或者使用另一个库,您应该运行
gcc-Wl,--verbose
,以了解链接器如何搜索库,以及链接器脚本在哪里。
$ 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 ) )
typedef struct {
    Elf32_Sword d_tag;
    union {
        Elf32_Word  d_val;
        Elf32_Addr  d_ptr;
    } d_un;
} Elf32_Dyn;