2011-04-05 56 views
13

ldd如何知道它取决于libc.so.6而不是libc.so.5libc.so.7了解ldd输出

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

回答

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] 
... 

(有对精灵怎么做存储信息的一些附加列在动力部分,但你可以看到libc.so.6的硬编码与因SONAME.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后缀的信息,它只是遍历所有试图打开libLIBNAME.solibLIBNAME.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___.solib___.so.3.4这是另一种符号链接到lib___.so.3.4.5.3.4名称将被记录在二进制的NEEDED字段中。

+0

0x00000001(NEEDED)是什么意思? – 2011-04-05 15:56:53

+0

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',对吧? – 2011-04-05 16:05:53

+1

+1用于编辑您的答案以包含非常有用的信息。这是一个经典的SO帖子。谢谢。 – 2011-04-05 20:15:43

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表THI联合成员指定的偏移量查找查找库的名字,这个二进制/ SO依赖于取决于。