静态链接的二进制文件如何比动态链接的二进制文件小?

时间:2015-01-01 04:58:52

标签: linux linker glibc static-linking dynamic-linking

如果您阅读有关stali的说明,则会提到静态链接的二进制文件大小:

  

它还通过避免glibc来减少二进制大小   和其他可能的膨胀GNU库(早期实验表明   静态链接的二进制文件通常比它们小   动态链接的glibc对应!!!)。

我不明白如何在二进制文件中包含库会使二进制文件小于包含库的二进制文件(可能还有我对statically vs dynamically linked缺少的东西)。

这怎么可能?这只发生在某些特定情况吗?

2 个答案:

答案 0 :(得分:2)

如果使用静态链接,链接器可以丢弃未使用的符号。

例如,您的库同时包含foobar,但可执行文件仅使用bar,然后foo将不会成为可执行文件的一部分。

如果无法进行动态链接,因为链接器/编译器无法知道构建库时将使用的内容。

除此之外,动态链接是一个可爱的错误来源(如segfaulting因为新的库不兼容),可以通过静态链接来避免。

进一步阅读:http://harmful.cat-v.org/software/dynamic-linking/

答案 1 :(得分:1)

  

我不明白如何在二进制文件中包含库会使二进制文件小于包含库的二进制文件

与动态链接相关的某些开销:例如您需要.dynsym.dynstr.got.plt部分才能从libc.so.6导入符号。

但是,除非主要可执行文件与-rdynamic链接,否则这些"开销"的大小。部分通常很小,因此声称全静态二进制文件较小似乎非常可疑。