假设我有一个库 - foo.so。在构建我的二进制文件(需要这个库)时,我可以 (1) 链接 foo.so ,或者 (2) 在程序源代码中,dlopen 这个库,然后调用这个库提供的函数
当我从库中调用函数时,(1)和(2)之间是否存在任何性能差异?请注意,我知道会有不同的初始化特征(例如 dlopen 的成本、首次使用符号的开销等),但在稳定状态下,两种替代方案是同样快还是更快?
谢谢。
最佳答案
如果库是使用 gcc -Wall -fPIC -O2
编译并使用 gcc 链接的共享对象(即一些
那么它是一个 ELF Position Independent Code共享库。lib*.so
文件)- shared
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 HowTo和 Levine's Linkers & Loaders书。
关于linux - dlopen 与链接开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18095151/