使用 `--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 一些补充阅读。
对于我的一个二进制文件,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 一些补充阅读。