dlopen vs连接开销

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

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

谢谢。

Solutions Collecting From Web of "dlopen vs连接开销"

如果库是一个用gcc -Wall -fPIC -O2编译的共享对象(即一些lib*.so文件)并且与gcc -shared链接,那么它是一个ELF 位置独立代码共享库。

PIC在32位x86上的成本要高一些,而在64位x86-64上只有很少的寄存器,有一些寻址方式可以促进PIC

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

当被调用的时候明智的表现就是lib*.so里面的代码,如果你把它链接起来,它就不会改变。

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

请阅读Drepper的“ 如何撰写共享库文件”和“ 程序库HowTo和Levine的链接器和装载器”一书。