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可以安全地删除.
对我的优化有影响吗?它完全安全吗?
这是安全的*,除非发生一件事(谢天谢地,在你的控制之下).
如果应用程序加载了其他符号dlsym(RTLD_DEFAULT,...),它将在当前加载的共享库中搜索相应的符号(函数).如果它的意图是从你要删除的其中一个库中加载符号(并且没有事先dlopen()调用),应用程序将找不到它,并且可能行为不端.
但是,请注意,dlsym()很少使用(并且您可以检查它是否通过ldd使用),并且在没有事先调用的情况下甚至更少使用它dlopen(),因此几乎在所有情况下您都可以安全地删除未使用的库.它将显着提高应用程序的可移植性.
*"安全"我的意思是"如果没有构建时错误,可能会工作".删除库的构建时间分支太容易检测以解释它们.
| 归档时间: |
|
| 查看次数: |
3845 次 |
| 最近记录: |