为什么动态链接的二进制文件显示硬编码的 SO 名称?
Why dynamic linked binary shows hard coded SO name?
抱歉,这可能是一个愚蠢的问题。
我没有直接 link 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]
这是什么意思,无论如何我可以检查为什么它被添加到我的二进制文件中?
谢谢
更新
谢谢。我正在阅读下面的 links 并添加更多发现。
我发现 libpam 是 linked 并且它需要 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 个二进制文件,都是 linked 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
关于关键字"NEEDED"让我很困惑,一个lib如果不是直接使用,什么时候"NEEDED"?
What does it mean
这意味着您的二进制文件依赖于它。
and is there anyway I can check why it is added into my binary?
很可能您使用的 linker 发现 link 行上的一些 other 库依赖于 libaudit
,并且 自动添加进去。
GNU-ld 会这样做,而 Gold 不会(产生源源不断的程序,这些程序具有不正确的 Makefile
并且无法 link 使用 Gold)。
如果你 link 带有 -v
标志,你应该看到实际的 link 命令,尽管它可能被 collect2
或一些类似的包装器隐藏。
运行 strace -fvs 1024 -e execve
下的 link 肯定会显示实际的 link 命令。
好的,找到原因了
这是由于我的代码中引用了“_edata”和“_end”。
在 libpam.so 中没有找到,但是 libpam.so 需要 libaudit.so,它被发现并且链接器解析了它,然后将 libaudit 添加为 "NEEDED".
并且 _end 从链接描述文件中暴露如下 –
_end = .;提供(结束=。);
这意味着,除非我们使用自己的链接器脚本提供“_end”,否则我们应该使用“end”而不是“_end”。
因此,解决方法是将 _end(以及所有此类相关符号,如 _etext 和 _edata)更改为 end(以及 etext、edata),以便从标准 libc 中正确解析它们,避免对其他共享对象的任何依赖,如 libaudit.so.
抱歉,这可能是一个愚蠢的问题。 我没有直接 link 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]
这是什么意思,无论如何我可以检查为什么它被添加到我的二进制文件中?
谢谢
更新
谢谢。我正在阅读下面的 links 并添加更多发现。 我发现 libpam 是 linked 并且它需要 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 个二进制文件,都是 linked 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
关于关键字"NEEDED"让我很困惑,一个lib如果不是直接使用,什么时候"NEEDED"?
What does it mean
这意味着您的二进制文件依赖于它。
and is there anyway I can check why it is added into my binary?
很可能您使用的 linker 发现 link 行上的一些 other 库依赖于 libaudit
,并且 自动添加进去。
GNU-ld 会这样做,而 Gold 不会(产生源源不断的程序,这些程序具有不正确的 Makefile
并且无法 link 使用 Gold)。
如果你 link 带有 -v
标志,你应该看到实际的 link 命令,尽管它可能被 collect2
或一些类似的包装器隐藏。
运行 strace -fvs 1024 -e execve
下的 link 肯定会显示实际的 link 命令。
好的,找到原因了
这是由于我的代码中引用了“_edata”和“_end”。 在 libpam.so 中没有找到,但是 libpam.so 需要 libaudit.so,它被发现并且链接器解析了它,然后将 libaudit 添加为 "NEEDED".
并且 _end 从链接描述文件中暴露如下 –
_end = .;提供(结束=。);
这意味着,除非我们使用自己的链接器脚本提供“_end”,否则我们应该使用“end”而不是“_end”。 因此,解决方法是将 _end(以及所有此类相关符号,如 _etext 和 _edata)更改为 end(以及 etext、edata),以便从标准 libc 中正确解析它们,避免对其他共享对象的任何依赖,如 libaudit.so.