Linux 静态链接的二进制文件比动态链接的二进制文件小多少?

Linux 静态链接的二进制文件比动态链接的二进制文件小多少?,linux,linker,glibc,static-linking,dynamic-linking,Linux,Linker,Glibc,Static Linking,Dynamic Linking,如果您阅读了有关的描述,它会提到静态链接的二进制文件大小: 它还通过避免glibc来减少二进制大小 以及其他可能的臃肿GNU库(早期实验表明 静态链接的二进制文件通常比它们的 动态链接的glibc副本!!!) 我不明白在二进制文件中包含库本身如何使二进制文件比包含库的二进制文件更小(也许我缺少一些东西) 这怎么可能?这是否只发生在某些特定情况下 我不明白在二进制文件中包含库如何使二进制文件比包含库的二进制文件更小 动态链接有一定的开销:例如,您需要.dynsym、.dynstr、.got和.pl

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

它还通过避免glibc来减少二进制大小 以及其他可能的臃肿GNU库(早期实验表明 静态链接的二进制文件通常比它们的 动态链接的glibc副本!!!)

我不明白在二进制文件中包含库本身如何使二进制文件比包含库的二进制文件更小(也许我缺少一些东西)

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

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

动态链接有一定的开销:例如,您需要
.dynsym
.dynstr
.got
.plt
节,以便从
libc.so.6
导入符号


但是,除非主可执行文件与
-rdynamic
链接,否则这些“开销”部分的大小通常非常小,因此完全静态二进制文件更小的说法似乎非常可疑。

如果使用静态链接,链接器可能会抛出未使用的符号

例如,您的库既有
foo
又有
bar
,但可执行文件只使用
bar
,那么
foo
将不会是可执行文件的一部分

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

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

进一步阅读: