Linux dlopen与链接开销

Linux dlopen与链接开销,linux,dynamic,linker,dlopen,Linux,Dynamic,Linker,Dlopen,假设我有一个图书馆——foo.so。在构建二进制文件(需要此库)时,我可以(1)链接foo.so,或者(2)在程序源代码中打开此库,然后调用此库提供的函数 从库中调用函数时,(1)和(2)之间是否存在性能差异?请注意,我知道会有不同的初始化特性(如dlopen的成本、首次使用符号的开销等),但在稳定状态下,这两个备选方案是同样快还是更快 谢谢。如果库是使用gcc-Wall-fPIC-O2编译并链接到gcc-shared的共享对象(即一些lib*.so文件),那么它就是一个共享库 32位x86上的

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

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


谢谢。

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

32位x86上的PIC比64位x86-64上的PIC要贵一点,因为64位x86-64具有一些便于PIC的寻址模式

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

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

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


阅读德雷珀的论文和《与》一书。

dlopen
是否通过指针提供了额外的间接层?不是w.r.t。一些共享库(如
libc.so
)也使用间接层