Clang / GCC真的支持延迟加载function吗?

如果您真的体验过与上述标题相关的内容,您是否愿意留下您的评论? 我试图做一个共享对象延迟加载与Clang和GCC在Ubuntu上(我其实不介意使用哪个编译器),但他们看起来不是真的支持任何延迟加载function(我期望延迟加载function把一个存根放到一个父对象中,这个父对象试图按需要加载另一个对象,此时需要这个function,但实际上并没有)。 以下命令显示我试图将libbar.so延迟加载到libfoo.so:

clang bar.c -fPIC -shared -o libbar.so clang foo.c -Wl,-zlazy,lL'/path/to/where/lib/is',-lbar -o foo 

如果libbar.so不存在,您将在input条目之前看到libfoo.so引发exception。 无论如何,我不介意上面的命令是否有错字,但是想知道Clang / GCC是否真的支持延迟加载function

但是就我个人而言,如果Clang / GCC不支持任何延迟加载特性,我不相信Linux程序开发者是否需要调用dlopen()或dlsym()来使共享对象延迟加载。 如果对象是用C编写的,但是如果用C ++编写的话,情况必须完全复杂:

我相信一个在编译器或链接器的帮助下实现的解决scheme是最好的,因为我已经成功地在Windows和Mac OS上完成了它。 所以我觉得这将是一个自然的反应,即使在Clang / GCC上,公民也希望拥有延迟加载function。 如果您对我的感受有任何评论,我也会很感激。

PS。 我知道Solaris支持延迟加载function,但这不是我的方式,因为我不会开发任何东西。

无论如何,非常感谢你提前。

Solutions Collecting From Web of "Clang / GCC真的支持延迟加载function吗?"

这更多的是由运行时链接程序ld-linux.so提供的功能问题。

这个链接器不支持符号的惰性绑定,但不支持延迟加载库。 这意味着当程序启动时,可执行程序所需的每个共享对象都会被加载,但程序中的符号在被首次引用之前不会被解析到加载的库中。

原因是性能。 一个库可能包含数千个函数的符号,这些函数在程序的单个执行过程中永远不会被调用。 解决这些都是浪费时间。

因为这个原因,如果一个库不包含预期的符号,那么在程序开始运行之后,你可以很好的得到'未定义的符号'的错误,但是如果一个库完全丢失了,你会在程序启动之前得到一个错误。

你正在引用的-zlazy选项只控制懒惰的符号绑定。 实际上它是默认启用的(至少对于GCC,我没有检查叮当)。

在程序启动后加载库的唯一方法是调用dlopen ,例如响应某些命令行选项,配置或其他动态条件。

你可能想要寻找一个好的插件框架 – 参考见:

  • 跨平台的C + +动态库插件加载器
  • 什么是C ++插件系统的安全?
  • 基于C / C ++插件的系统的良好模式?