首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解ldd输出

了解ldd输出
EN

Stack Overflow用户
提问于 2011-04-05 23:26:27
回答 2查看 9.6K关注 0票数 13

ldd如何知道它依赖于libc.so.6,而不是libc.so.5libc.so.7

代码语言:javascript
复制
libc.so.6 => /lib64/libc.so.6 (0x00000034f4000000)
/lib64/ld-linux-x86-64.so.2 (0x00000034f3c00000)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-05 23:34:25

它记录在应用程序二进制文件本身中(在编译时指定,更准确地说是在链接步骤中指定,使用ld完成):

代码语言:javascript
复制
$ 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,libc.so.6被硬编码为带有.6后缀)

或者甚至不了解ELF文件格式:

代码语言:javascript
复制
$ strings /bin/echo |grep libc.so
libc.so.6

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

代码语言:javascript
复制
$ 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

Linker对.digit后缀一无所知,它只是遍历所有库搜索目录,试图打开libLIBNAME.solibLIBNAME.a,其中LIBNAME是-l选项后的字符串。(默认情况下添加-lc选项)。

第一个成功的是/usr/lib/libc.so,它本身不是一个库,而是一个链接器脚本(文本文件)。下面是典型libc.so脚本中的内容:

代码语言:javascript
复制
$ 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名称将记录在二进制文件的所需字段中。

票数 17
EN

Stack Overflow用户

发布于 2012-04-06 06:40:45

http://www.sco.com/developers/gabi/latest/ch5.dynamic.html#dynamic_section

有每个动态标签的含义。1表示它是一个DT_NEEDED标记,在本例中表示

代码语言:javascript
复制
typedef struct {
    Elf32_Sword d_tag;
    union {
        Elf32_Word  d_val;
        Elf32_Addr  d_ptr;
    } d_un;
} Elf32_Dyn;

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5554343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档