c++ - 动态链接 : is it possible to disable automatic loading of non used shared objects?

标签 c++ compilation fortran dynamic-linking shared-objects

我对动态库的了解有限,经常遇到与我不了解的库相关的问题。 我最近从谷歌搜索中了解到图书馆,尤其是从以下链接:

如果我理解得很好(如果我错了请纠正我),共享对象有两种可能的用法:

  • 动态链接:共享对象在程序启动时由动态链接器自动加载。

  • 动态加载:共享对象在运行时通过动态加载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/

相关文章:

c++ - 如何在 C++ 中执行 SQLite 语句

c++ - 一个普通的链表

C++ Qt : Can't compile GoldenDict

c++ - 退出时覆盖不明确的函数时代码如何运行?

pointers - Fortran 中类型结构的重新指向

c++ - 维护一个对象容器,该容器按该对象的成员与其邻居的成员之间的差异排序

c++ - 钻石层次结构中的低落

java - 初级 boolean 编译错误

c++ - 将大量数据从 FORTRAN 传递到 C++

fortran - 如果任何过程接口(interface)未明确定义,或在 Fortran 90+ 的模块中,则会引发错误