2009-06-20 97 views

回答

10

是的,你需要静态库来建立一个静态链接的可执行文件。

静态库是编译对象的包。当静态链接到库时,它与获取该库的编译结果,在当前项目中解压缩它们并将它们用作自己的对象相同。

动态库已经链接。这意味着像重定位这样的信息已经被修复并被抛出。

此外,动态库必须编译为位置无关的代码。这不是对静态库的限制,并且会在某些常见平台(如x86)上导致性能的显着差异。

存在诸如ELF Statifier这样的工具,它们试图将动态链接的库绑定到动态链接的可执行文件中,但在任何情况下都很难生成正确运行的结果。

+1

感谢您的一个很好的答案。但为什么这么难? – 2009-06-20 18:10:13

+2

ELF Statfier加载可执行文件及其所有库,然后获取进程内存的快照。当输出图像运行时,会导致内存布局改变的任何事情(例如随机化的VDSO)将导致错误的操作。任何其他方法都需要重新创建动态链接器。 – ephemient 2009-06-20 19:00:06

6

没有静态编译,只有静态链接。为此,您需要静态库。静态链接和动态链接之间的区别在于,前者的名称在链接时(仅在编译时之后)解析,而后者则在程序开始运行时解析。

静态和动态库可能包含或不包含相同的信息,具体取决于许多因素。关于是否静态或动态链接您的代码的决定非常重要,并且通常会影响应用程序体系结构。

+0

谢谢,纠正'编译'为'链接'。 – 2009-06-20 18:06:27

2

链接到静态链接程序的所有库必须是静态变体。虽然动态(libfoo.so)和静态(libfoo.a)库在它们中具有相同的功能,但它们是不同的格式文件,因此您需要程序的匹配类型。