我对动态库知之甚少,而且我常常遇到与我不理解的库相关的问题。 我最近从谷歌搜索中学到了图书馆,尤其是以下链接:
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)在程序控件下加载和使用共享对象。该选项对插件非常有用。
如果我把一切都搞定了,在动态链接的情况下,所有符号都在编译时验证。这允许编译器/链接器确切地知道程序有效使用哪个共享对象以及未使用哪个共享对象。
现在,即使未使用共享对象,也总是在运行时调用动态链接器。可以通过将空程序链接到不在运行时可搜索的位置的库来验证,并且执行将失败。当有更新并且不再需要使用库时,可以将程序与程序中实际未使用的库链接。当一个程序隔离一部分程序进行调试时,也会发生这种情况,并链接到主程序的所有库。
我的问题是:是否有一个选项可以要求编译器/链接器不包含对没有程序中引用的符号的共享对象的引用? 是否存在妨碍编译器执行此操作的问题?
以下帖子与目前的问题有一些相似之处,但它们都没有得到接受的答案,也没有满足我好奇心的答案:
答案 0 :(得分:1)
如果您碰巧使用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
但是我实际上不确定编译器是否可以在一般情况下执行此操作。考虑一个依赖的共享库,它对您要从链接行中删除的库有一个弱引用:编译器如何知道在该点删除库和/或符号是安全的?