7

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

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

谢谢。

4

1 回答 1

6

如果库是一个共享对象(即某个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 HowToLevine 的 Linkers & Loaders一书。

于 2013-08-07T05:20:04.850 回答