gpt4 book ai didi

linker - 了解 ldd 输出

转载 作者:行者123 更新时间:2023-12-03 23:28:59 24 4
gpt4 key购买 nike

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)

最佳答案

它记录在应用程序二进制文件本身中(在编译时指定,更准确地说是在链接步骤,使用 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 使用 .6 后缀进行硬编码,因为 SONAME )

甚至不了解 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是某些版本的符号链接(symbolic link),例如 lib___.so.3.4.5并且有SONAME字段填写 lib___.so.3.4.5ld 说不要链接到 lib___.so但是到 lib___.so.3.4这是 lib___.so.3.4.5 的另一个符号链接(symbolic link). .3.4名称将记录在二进制的 NEEDED 字段中。

关于linker - 了解 ldd 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5554343/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com