Linux dlopen与链接开销
假设我有一个图书馆——foo.so。在构建二进制文件(需要此库)时,我可以(1)链接foo.so,或者(2)在程序源代码中打开此库,然后调用此库提供的函数 从库中调用函数时,(1)和(2)之间是否存在性能差异?请注意,我知道会有不同的初始化特性(如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上的
谢谢。如果库是使用
gcc-Wall-fPIC-O2
编译并链接到gcc-shared
的共享对象(即一些lib*.so
文件),那么它就是一个共享库
32位x86上的PIC比64位x86-64上的PIC要贵一点,因为64位x86-64具有一些便于PIC的寻址模式
如果它是dlopen
-ed或是动态链接的,则在性能方面是相同的(稳态)。因为在这两种情况下,真正的链接都是由(例如,ld linux.so
)sinelibdl完成的。因此
基本上是动态链接器的包装器
在调用时,性能方面最重要的是lib*.so
中的代码,如果您dlopen
它或链接它,它不会改变
如果库是静态链接的lib*.a
,情况可能会略有不同。您甚至可以使用最新的GCC编译器编译和链接库和程序(使用GCC-flto-Wall-O2
编译和链接)
阅读德雷珀的论文和《与》一书。但
dlopen
是否通过指针提供了额外的间接层?不是w.r.t。一些共享库(如libc.so
)也使用间接层