【问题标题】:How statically linked binaries could be smaller than dynamically linked binaries?静态链接的二进制文件如何比动态链接的二进制文件小?
【发布时间】:2015-02-27 23:19:31
【问题描述】:

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

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

我不明白如何在二进制文件本身中包含库会使二进制文件比包含库的二进制文件更小(也许我在statically vs dynamically linked 方面遗漏了一些东西)。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    除此之外,动态链接是一个很好的错误来源(比如由于较新的库不兼容而导致的段错误),可以通过静态链接来避免。

    延伸阅读:http://harmful.cat-v.org/software/dynamic-linking/

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 2015-03-19
        • 2013-06-02
        • 1970-01-01
        相关资源
        最近更新 更多