linux - dlopen 与链接开销

标签 linux dynamic linker dlopen

假设我有一个库 - foo.so。在构建我的二进制文件(需要这个库)时,我可以 (1) 链接 foo.so ,或者 (2) 在程序源代码中,dlopen 这个库,然后调用这个库提供的函数

当我从库中调用函数时,(1)和(2)之间是否存在任何性能差异?请注意,我知道会有不同的初始化特征(例如 dlopen 的成本、首次使用符号的开销等),但在稳定状态下,两种替代方案是同样快还是更快?

谢谢。

最佳答案

如果库是使用 gcc -Wall -fPIC -O2 编译并使用 gcc 链接的共享对象(即一些 lib*.so 文件)- shared 那么它是一个 ELF Position Independent Code共享库。

PIC 在 32 位 x86(寄存器很少)上比在 64 位 x86-64(有一些寻址模式有利于 PIC)上要贵一些

如果它是 dlopen 编辑的或者如果它是动态链接的,它在性能方面是相同的(在稳定状态下)。因为在这两种情况下,真正的链接都是由 dynamic linker 完成的。 (例如 ld-linux.so)正弦 libdl.so 基本上是动态链接器的包装器。

在调用时,性能方面最重要的是 lib*.so 中的代码,如果您 dlopen 或链接它,它不会改变。

如果库是静态链接lib*.a,情况可能会略有不同。您甚至可以使用 link time optimization 编译和链接库和程序。最近的 GCC 编译器的能力(用 gcc -flto -Wall -O2 编译和链接)

阅读 Drepper 的 How to Write Shared Library纸和 Program Library HowToLevine's Linkers & Loaders书。

关于linux - dlopen 与链接开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18095151/

相关文章:

javascript - 动态 html 页面导航

Android makefile 链接两次

sql - 如何通过 PL/SQL 中的变量动态插入?

linux - 为导出设备 linux 内核构建一个 sk_buff

linux - 查找、替换或插入 - 命令行

linux - 在 linux 中删除带有反斜杠的文件

javascript - 如何将 jquery droppable 绑定(bind)到动态创建的元素

c++ - 尝试使用模板扩展类时出现链接错误(LINK 2019)

c++ - "error LNK2001: unresolved external symbol"

c - 可以检索 glib 'event?' 上剩余的时间