dlopen与链接开销

时间:2013-08-07 05:15:43

标签: linux dynamic linker dlopen

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

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

感谢。

1 个答案:

答案 0 :(得分:3)

如果库是使用lib*.so编译并与gcc -Wall -fPIC -O2链接的共享对象(即某些gcc -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,情况可能略有不同。您甚至可以使用最近GCC编译器的link time optimization能力编译和链接库和程序(编译和链接gcc -flto -Wall -O2)< / p>

阅读Drepper的How to Write Shared Library论文以及Program Library HowToLevine's Linkers & Loaders一书。