抱歉,这可能是个愚蠢的问题。 我没有直接链接 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/