【发布时间】:2014-06-22 12:33:22
【问题描述】:
如果您真正体验过与上述标题相关的内容,您介意留下您的评论吗?我试图在 Ubuntu 上使用 Clang 和 GCC 延迟加载共享对象(我实际上不介意使用哪个编译器),但它们看起来并不真正支持任何延迟加载功能(我期望延迟加载功能在父对象中放置一个存根,该对象试图在需要该功能时按需加载另一个对象,但实际上并没有)。以下命令显示我试图使 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 不存在,您将在进入条目之前看到 libfoo.so 引发异常。无论如何,我不介意上述命令中是否有任何拼写错误,但我想知道 Clang/GCC 是否真的支持延迟加载功能。
然而,如果 Clang/GCC 不支持任何延迟加载功能,我个人无法相信 Linux 程序开发人员是否需要调用 dlopen() 或 dlsym() 来延迟加载共享对象。如果对象是用 C 写的还好,但如果是用 C++ 写的,情况肯定很复杂 :(
我相信在编译器或链接器的帮助下实现的解决方案是最好的,因为我已经在 Windows 和 Mac OS 上成功地做到了。所以我觉得这是一个自然的反应,公民想要梦想即使在 Clang/GCC 上也有延迟加载功能。如果您对我的感受有任何意见,我也将不胜感激。
PS。我知道 Solaris 支持延迟加载功能,但这不适合我,因为我不会在上面开发任何东西。
无论如何,提前非常感谢您。
【问题讨论】:
-
是的,这可以在 Linux 上完成。
-
@kec,谢谢。您的意思是 GCC/Clang 可以通过向它们传递一些选项来加载共享对象延迟吗?有没有官方文档描述如何使用它?很高兴知道您能否解释为什么我得到上述结果。
-
其实重读之后,我不确定我是否知道你在说什么。你在谈论 dlopen() 吗?你想发生什么?
-
@kec,很抱歉让您感到困惑。我知道可以使用 dlopen() 和 dlsum() 实现延迟加载功能,但不想在源代码中调用它们。相反,我想通过只是将一些选项标志传递给链接器或编译器并保持源代码原样来实现。
-
嗯...惰性绑定是默认设置。加载是否真的是懒惰的,我不确定,但真的有实际区别吗?如果你真的想知道,你可以使用
strace来找出库何时被mmap'ped in。你想达到什么目的?