我对动态库的了解有限,经常遇到与我不了解的库相关的问题。 我最近从谷歌搜索中了解到图书馆,尤其是从以下链接:
Difference between shared objects (.so), static libraries (.a), and DLL's (.so)? .
http://www.ibm.com/developerworks/library/l-dynamic-libraries/ .那篇文章对于理解动态库及其用法非常有用:
如果我理解得很好(如果我错了请纠正我),共享对象有两种可能的用法:
动态链接:共享对象在程序启动时由动态链接器自动加载。
动态加载:共享对象在运行时通过动态加载API(dlopen、dlerror、dlsym和dlclose)在程序控制下加载和使用。该选项对插件很有用。
如果我做对了,在动态链接的情况下,所有符号都在编译时验证。这允许编译器/链接器准确地知道程序有效使用了哪个共享对象,没有使用哪个共享对象。
现在,动态链接器总是在运行时被调用,即使没有使用共享对象。可以通过将一个空程序链接到不在运行时可搜索位置的库来验证,执行将失败。当有更新并且不再需要使用库时,可能会发生将程序链接到程序中实际未使用的库的情况。当分离程序的一部分进行调试,并链接到主程序的所有库时,也会发生这种情况。
我的问题是:是否有一个选项可以要求编译器/链接器不包含对程序中没有引用的符号的共享对象的引用? 是否有任何问题阻止编译器执行此操作?
以下帖子与当前问题有一些相似之处,但都没有公认的答案,也没有满足我好奇心的答案:
最佳答案
如果您碰巧使用 g++/ld,How to remove unused C/C++ symbols with GCC and ld? 上有一些建议
例如:
gcc -Os -fdata-sections -ffunction-sections test.cpp -o test.o -Wl,--gc-sections
-dead_strip
-dead_strip_dylibs
但是我实际上不确定编译器是否有可能在一般情况下执行此操作。考虑一个从属共享库,它对要从链接行中删除的库有弱引用:编译器如何知道此时删除库和/或符号是安全的?
关于c++ - 动态链接 : is it possible to disable automatic loading of non used shared objects?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22642742/