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

Far*_*hat 3 linux linker glibc dynamic-linking static-linking

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

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

我不明白在二进制文件中包含库如何使二进制文件比包含库的二进制文件小(也许我在静态与动态链接方面缺少一些东西)。

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

For*_*nix 8

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

例如,您的库同时具有foobar,但可执行文件仅使用bar,则foo不会成为可执行文件的一部分。

在动态链接的情况下这是不可能的,因为链接器/编译器无法知道构建库时将使用什么。

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

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