【问题标题】:Dynamic linking: is it possible to disable automatic loading of non used shared objects?动态链接:是否可以禁用自动加载未使用的共享对象?
【发布时间】:2014-03-25 18:02:27
【问题描述】:

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

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

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

  • 动态加载:共享对象在运行时通过动态加载API(dlopen、dlerror、dlsym和dlclose)在程序控制下加载和使用。该选项对插件很有用。

如果我做对了,在动态链接的情况下,所有的符号都会在编译时得到验证。这允许编译器/链接器准确地知道程序有效使用了哪个共享对象,哪个没有使用。

现在,动态链接器总是在运行时被调用,即使共享对象没有被使用。可以通过将空程序与运行时无法搜索的位置的库链接来验证它,并且执行将失败。当有更新并且不再需要使用库时,可能会发生将程序与程序中实际未使用的库链接的情况。当隔离程序的一部分进行调试,并链接到主程序的所有库时,也会发生这种情况。

我的问题是:是否可以要求编译器/链接器不包含对程序中没有引用符号的共享对象的引用? 是否有任何问题阻止编译器这样做?

以下帖子与当前问题有一些相似之处,但没有一个可以接受答案,也没有满足我好奇心的答案:

【问题讨论】:

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


【解决方案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

但是我实际上不确定编译器是否可以在一般情况下执行此操作。考虑一个依赖共享库,它对要从链接行中删除的库具有弱引用:编译器如何知道此时删除库和/或符号是安全的?

【讨论】:

  • 似乎 -dead_strip 和 -dead_strip_dylibs 是机器相关选项(达尔文)。这对我来说是一次头脑风暴!我仍然时不时想。
  • 你可能想提到-Wl,--as-needed(它应该在现代发行版中自动启用,但仍然如此)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
  • 2011-06-06
  • 2020-10-28
  • 2014-05-31
  • 1970-01-01
  • 2023-02-24
  • 2012-03-15
相关资源
最近更新 更多