根据ldd报告删除未使用的库是否完全安全?

Ela*_*ich 3 makefile g++ dynamic ld

我正在清理一个腐烂的源代码树,我尝试使每个可执行文件和每个共享库只链接到他们直接使用的库.

为了做到这一点,我ldd -u- r是二进制输出,并从makefile中删除报告的库.

例如:

$ ldd -u -r ./libA.so
Unused direct dependencies:
        /usr/local/lib/libB.so
        /usr/local/lib/libC.so
        /lib/tls/libpthread.so.0
$ sed -i'' -e 's/-lB//' -e 's/-lC//' Makefile
Run Code Online (Sandbox Code Playgroud)

嗯,当然libpthread真的需要(并且无论如何都隐含地包含在内-pthread),但报告的其余库ldd可以安全地删除.

对我的优化有影响吗?它完全安全吗?

P S*_*ved 6

这是安全的*,除非发生一件事(谢天谢地,在你的控制之下).

如果应用程序加载了其他符号dlsym(RTLD_DEFAULT,...),它将在当前加载的共享库中搜索相应的符号(函数).如果它的意图是从你要删除的其中一个库中加载符号(并且没有事先dlopen()调用),应用程序将找不到它,并且可能行为不端.

但是,请注意,dlsym()很少使用(并且您可以检查它是否通过ldd使用),并且在没有事先调用的情况下甚至更少使用它dlopen(),因此几乎在所有情况下您都可以安全地删除未使用的库.它将显着提高应用程序的可移植性.


*"安全"我的意思是"如果没有构建时错误,可能会工作".删除库的构建时间分支太容易检测以解释它们.