静态链接的二进制文件为什么会比动态链接的二进制文件更小?

4
如果您阅读stali的描述,它提到了静态链接二进制文件大小的问题:
它还通过尽可能避免使用glibc和其他臃肿的GNU库来减小二进制文件的大小(早期实验表明,静态链接的二进制文件通常比动态链接的glibc版本小!!!)。
我不明白将库包含在二进制文件本身中如何使二进制文件比包含库的二进制文件更小(也许我在 静态链接与动态链接方面有所疏漏)。
这是怎么可能的?这只会发生在某些特定情况下吗?
2个回答

10
如果您使用静态链接,链接器可以舍弃未使用的符号。
例如,您的库同时有 foobar,但可执行文件只使用 bar,那么 foo 将不会成为可执行文件的一部分。
对于动态链接来说,这是不可能的,因为链接器/编译器无法知道在构建库时将使用什么。
除此之外,动态链接是错误的可爱源泉(例如由于新库不兼容而导致的 segfault),这些错误可以通过静态链接来避免。
进一步阅读:http://harmful.cat-v.org/software/dynamic-linking/

1
我不明白如何将库包含在二进制文件中会使二进制文件比包含库的二进制文件更小。
动态链接有一定的开销:例如,您需要 .dynsym.dynstr.got.plt 部分才能从 libc.so.6 中导入符号。
然而,除非主可执行文件使用 -rdynamic 进行链接,否则这些“开销”部分的大小通常非常小,因此声称完全静态的二进制文件更小似乎相当可疑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接