理解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
完成):
$ 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
传递给
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
后缀一无所知,只是迭代所有试图打开
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
,并且在
lib___.so.3.4.5
中填充的SONAME字段对
ld
链接不是对
lib___.so
,而是对
lib___.so.3.4
是对
lib___.so.3.4.5
的另一个符号链接。
.3.4
名称将记录在二进制的NEEDED字段中。     
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联合成员指定的偏移量,以查找此二进制文件/ SO所依赖的库的名称。     

要回复问题请先登录注册