dlopen vs链接开销

MK.*_*MK. 5 linux linker dynamic dlopen

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

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

谢谢。

Bas*_*tch 6

如果库是一个共享对象(即某个lib*.so文件)编译gcc -Wall -fPIC -O2和链接,gcc -shared那么它是一个ELF 位置无关代码共享库。

PIC 在 32 位 x86(寄存器很少)上比在 64 位 x86-64 上的成本要高一些——它有一些促进 PIC 的寻址模式

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

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

如果库是静态链接的,情况可能会略有不同lib*.a。你甚至可以编译和链接两个库和程序与链接时优化最近GCC编译能力(编译和链接gcc -flto -Wall -O2

阅读 Drepper 的How to Write Shared Library论文和Program Library HowToLevine 的 Linkers & Loaders一书。