假设我有一个库 - foo.so 。当构建我的二进制文件(需要这个库)时,我可以(1)链接 foo.so ,或者(2)在程序源代码中,dlopen 这个库,然后调用这个库提供的函数
当我从库中调用函数时,(1) 和 (2) 之间有性能差异吗?请注意,我知道会有不同的初始化特征(例如 dlopen 的成本、第一次使用符号的开销等),但在稳定状态下,两种替代方案是否同样快或者一个更快?
Thanks.
如果库是共享对象(即某些lib*.so
文件)编译为gcc -Wall -fPIC -O2
并与gcc -shared
那么它是一个ELF http://en.wikipedia.org/wiki/Executable_and_Linkable_Format 位置无关代码 http://en.wikipedia.org/wiki/Position-independent_code共享库。
PIC is a bit more costly on 32 bits x86 -which has few registers- than on 64 bits x86-64 -which has some addressing mode facilitating PIC
如果是,则性能相同(在稳定状态下)dlopen
-ed 或者如果它是动态链接的。因为在这两种情况下,真正的链接都是由动态链接器 http://en.wikipedia.org/wiki/Dynamic_linker (e.g. ld-linux.so
) sine libdl.so
基本上是动态链接器的包装器。
What matters performance wise when called is the code inside the lib*.so
and it does not change if you dlopen
it or if you link it.
如果图书馆是的话,情况可能会略有不同静态地 linked lib*.a
。你甚至可以编译并link库和程序都带有链接时间优化 http://en.wikipedia.org/wiki/Link_Time_Optimization最近的 GCC 编译器的能力(编译和link with gcc -flto -Wall -O2
)
阅读德雷珀的如何编写共享库 http://www.akkadia.org/drepper/dsohowto.pdf纸和程序库操作方法 http://tldp.org/HOWTO/Program-Library-HOWTO/ and Levine 的链接器和加载器 http://www.iecc.com/linker/ book.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)