假设我有一个库 - foo.so 。在构建我的二进制文件(需要这个库)时,我可以(1)链接 foo.so ,或者,(2)在程序源代码中,dlopen 这个库,然后调用这个库提供的函数
当我从库中调用函数时,(1) 和 (2) 之间是否存在性能差异?请注意,我知道会有不同的初始化特性(例如 dlopen 的成本、第一次使用符号的开销等),但在稳定状态下,这两种选择是同样快还是更快?
谢谢。
如果库是一个共享对象(即某个lib*.so
文件),用它编译gcc -Wall -fPIC -O2
和链接,gcc -shared
那么它就是一个ELF 位置无关代码共享库。
PIC 在 32 位 x86(寄存器很少)上比在 64 位 x86-64(有一些寻址模式促进 PIC)上的成本要高一些
如果它是dlopen
-ed 或者如果它是动态链接的,那么它在性能方面是相同的(在稳定状态下)。因为在这两种情况下,真正的链接都是由动态链接器完成的(例如ld-linux.so
),sinelibdl.so
基本上是动态链接器的包装器。
调用时最重要的是性能方面的代码,如果您使用它或链接它lib*.so
,它不会改变。dlopen
如果库是静态链接的,情况可能会略有不同lib*.a
。您甚至可以使用最近 GCC 编译器的链接时间优化能力来编译和链接库和程序(编译和链接)gcc -flto -Wall -O2
阅读 Drepper 的How to Write Shared Library论文和Program Library HowTo和Levine 的 Linkers & Loaders一书。