c++ - 为什么动态链接的二进制文件显示硬编码的 SO 名称?

标签 c++ c linker elf

抱歉,这可能是个愚蠢的问题。 我没有直接链接 libaudit,但为什么它的名称显示在我的二进制文件中?

字符串显示:

strings dataserver|grep libaudit
libaudit.so.0

readelf 展示:

readelf -a dataserver|grep "Shared lib"
0x0000000000000001 (NEEDED)             Shared library: [libsapcrypto.so]
0x0000000000000001 (NEEDED)             Shared library: [libaio.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libnsl.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED)             Shared library: [libpam.so.0]
0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
0x0000000000000001 (NEEDED)             Shared library: [libaudit.so.0]

这是什么意思,无论如何我可以检查为什么它被添加到我的二进制文件中?

谢谢

更新

谢谢。我正在阅读下面的链接并添加更多发现。 我发现 libpam 已链接,它需要 libaudit.so.0

检查libpam.so.0

ldd /lib64/libpam.so.0
linux-vdso.so.1 =>  (0x00007ffff7fdf000)
libaudit.so.0 => /lib64/libaudit.so.0 (0x00007ffff7b80000)   <-- libaudit
libdl.so.2 => /lib64/libdl.so.2 (0x00007ffff797c000)
libc.so.6 => /lib64/libc.so.6 (0x00007ffff7616000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fe0000)

但是,我有 2 个二进制文件,都链接了 libpam.so。对于 binary1,它将 libaudit.so.0 列为 NEEDED,但对于 binary2,则不是。

binary1(使用 libpam 但不依赖于 libaudit.so.0):

readelf -d binary1|grep "Shared lib"
0x0000000000000001 (NEEDED)             Shared library: [libsybcsi_core210.so]
0x0000000000000001 (NEEDED)             Shared library: [libsybcsi_profiler210.so]
0x0000000000000001 (NEEDED)             Shared library: [libsybcsi_propertiesconfig210.so]
0x0000000000000001 (NEEDED)             Shared library: [libsybcsi_openssl210.so]
0x0000000000000001 (NEEDED)             Shared library: [libaio.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libnsl.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED)             Shared library: [libpam.so.0]       <--- libpam
0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

binary2(使用 libpam 但依赖于 libaudit.so.0):

readelf -d binary2|grep "Shared lib"
0x0000000000000001 (NEEDED)             Shared library: [libsapcrypto.so]
0x0000000000000001 (NEEDED)             Shared library: [libaio.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libnsl.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]
0x0000000000000001 (NEEDED)             Shared library: [libpam.so.0]       <--- libpam
0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED)             Shared library: [librt.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]
0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
0x0000000000000001 (NEEDED)             Shared library: [libaudit.so.0] <--- libaudit

“需要”这个关键词让我很困惑,如果一个库不是直接使用,什么时候它是“需要”的?

最佳答案

What does it mean

这意味着您的二进制文件依赖于它。

and is there anyway I can check why it is added into my binary?

很可能您使用的链接器发现链接行上的某些其他库依赖于libaudit,并且自动将其添加进去。

GNU-ld 会这样做,而 Gold 不会(产生稳定的程序流,这些程序具有不正确的 Makefile 并且无法与 Gold 链接)。

如果您使用 -v 标志进行链接,您应该会看到实际的链接命令,尽管它可能被 collect2 或某些此类包装器隐藏。

strace -fvs 1024 -e execve 下运行链接肯定会显示实际的链接命令。

关于c++ - 为什么动态链接的二进制文件显示硬编码的 SO 名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43671295/

相关文章:

c++ - STL集合了什么样的树实现?

c++ - 如何使用 std::for_each?

c - 编写一个程序,读取输入文件并识别所有重复的单词

c - "undefined reference to"C header 中的一个函数,但不是另一个函数

c++ - 在 Xcode 上用 C++ 创建模板类

c++ - 二进制文件不能多次使用?

c++ - 指向局部变量的指针存储在该变量的范围之外

C 程序未打印出正确的输出

c++ - 未找到/usr/local/lib 中的库

linux - 与 pthreads 和 stdc++ 的静态链接?