我有一个程序的 make 文件,该程序使用以下行 -ldl 链接到 libdl.so。没有调用 dlopen 或任何相关函数。即使您不使用任何函数,以这种方式链接到该库会产生什么效果?
您必须阅读链接器的文档。来自info ld我的 Linux/ELF/GNU Binutils 系统(添加了重点):
`--按需'
`--不按需要'
此选项影响动态库的 ELF DT_NEEDED 标记
在命令行中的“--as-needed”选项之后提到。
通常链接器会为每个动态添加一个 DT_NEEDED 标签
命令行中提到的库,无论是否
库实际上是否需要。 `--as-need' 会导致
DT_NEEDED 标记仅针对满足以下条件的库发出
来自常规目标文件的未定义符号引用,或者,如果
在其他库的 DT_NEEDED 列表中找不到该库
链接到该点,来自未定义的符号引用
另一个动态库。`--no-as-needed' 恢复默认值
行为。
ldd您可以通过运行测试程序来检查自己。在一个简单的测试程序中,我得到:
linux-vdso.so.1 => (0x00007fffd8305000)
libc.so.6 => /lib/libc.so.6 (0x00007f646c669000)
/lib/ld-linux-x86-64.so.2 (0x00007f646c9ca000)
Run Code Online (Sandbox Code Playgroud)
但是,如果我链接-ldl,我会得到:
linux-vdso.so.1 => (0x00007fff644f1000)
libdl.so.2 => /lib/libdl.so.2 (0x00007fb9b1375000)
libc.so.6 => /lib/libc.so.6 (0x00007fb9b1014000)
/lib/ld-linux-x86-64.so.2 (0x00007fb9b1579000)
Run Code Online (Sandbox Code Playgroud)
即使libdl我的程序没有使用。但是,如果我使用 , 运行 GCC -Wl,--as-needed,libdl则不会被链接。根据我的测试,只有在之前-Wl,--as-needed在命令行上列出时,这才有效。 -ldl
有什么影响? 这意味着即使您不使用共享库,您的二进制文件也无法在没有共享库的系统上运行。这也意味着如果您升级共享库并卸载旧的共享库,您的二进制文件将会损坏。这不是什么大问题,因为二进制兼容性无论如何都是一个问题,但我认为-Wl,--as-needed一般项目没有理由不启用。