gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:59:54 25 4
gpt4 key购买 nike

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

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com