gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:48 26 4
gpt4 key购买 nike

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

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