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

Using `--as-needed` but `ldd -u -r` still reports unused direct dependencies

对于我的一个二进制文件,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

为什么?

--as-needed 在链接阶段通过忽略共享库(当前正在处理)工作,如果它没有解析任何 当前 未知符号。部分垃圾收集 (--gc-sections) 在此之后启动,它可能导致删除所有(在上一步中)使用给定共享库解析的符号引用,导致原始 post 中提到的行为。 =13=]

Here is 一些补充阅读。