链接到不进行函数调用的库会产生什么影响?

ojb*_*ass 2 c linker

我有一个程序的 make 文件,该程序使用以下行 -ldl 链接到 libdl.so。没有调用 dlopen 或任何相关函数。即使您不使用任何函数,以这种方式链接到该库会产生什么效果?

Die*_*Epp 6

您必须阅读链接器的文档。来自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-neededlibdl则不会被链接。根据我的测试,只有在之前-Wl,--as-needed在命令行上列出时,这才有效。 -ldl

有什么影响? 这意味着即使您不使用共享库,您的二进制文件也无法在没有共享库的系统上运行。这也意味着如果您升级共享库并卸载旧的共享库,您的二进制文件将会损坏。这不是什么大问题,因为二进制兼容性无论如何都是一个问题,但我认为-Wl,--as-needed一般项目没有理由不启用。