使用`--as-needed`但`ldd -u -r`仍然报告未使用的直接依赖关系

时间:2019-07-19 19:32:56

标签: gcc linker ld ldd

对于我的一个二进制文件,CMake生成如下所示的cmdline:

/opt/rh/devtoolset-8/root/usr/bin/g++  
-O3 -DNDEBUG   
-s 
-Wl,--as-needed 
-Wl,--gc-sections 
<blah-blah>.o
...
-o procmon.e 
-Wl,-rpath,/usr/local/lib64
<my lib>.a
...
/usr/local/lib64/libxalan-c.so 
/usr/local/lib64/libxerces-c.so
/home/user/vcpkg/installed/x64-linux/lib/libcurl.a 
...
-lcrypt 
<more vcpkg static libs>
-lrt 
-lpthread 
<more vcpkg static libs>
-lm 
<more vcpkg static libs>
-ldl 
<more vcpkg static libs>
-pthread 
<more vcpkg static libs>

如您所见,已指定--as-needed,但最终仍然有未使用的依赖项:

$ ldd -u -r procmon.e
Unused direct dependencies:
        /usr/local/lib64/libxalan-c.so.111
        /lib64/libcrypt.so.1
        /lib64/libm.so.6

为什么?

1 个答案:

答案 0 :(得分:0)

--as-needed在链接阶段通过忽略无法解析任何当前未知符号的共享库(当前正在处理)来工作。在此之后,将开始对节(--gc-sections)进行垃圾收集,这可能导致删除使用给定的共享库(在上一步中)解决的所有符号引用,从而导致原始帖子中提到的行为。

Here is其他一些阅读内容。