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

How statically linked binaries could be smaller than dynamically linked binaries?

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

It also targets binary size reduction through the avoidance of glibc and other bloated GNU libraries where possible (early experiments show that statically linked binaries are usually smaller than their dynamically linked glibc counterparts!!!).

我不明白在二进制文件本身中包含库如何使二进制文件比包含库的二进制文件更小(也许关于 statically vs dynamically linked 我遗漏了什么)。

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

I don't understand how including libraries in the binary itself will make the binary smaller than a binary with libraries included

动态链接有一定的开销:例如您需要 .dynsym.dynstr.got.plt 部分才能从 libc.so.6.

导入符号

然而,除非主可执行文件与 -rdynamic 链接,否则这些 "overhead" 部分的大小通常非常小,因此关于全静态二进制文件更小的说法似乎很可疑.

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

例如,你的库有foobar,但可执行文件只使用bar,那么foo将不会成为可执行文件的一部分。

在不可能进行动态链接的情况下,因为 linker/compiler 无法知道在构建库时将使用什么。

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

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