c - 为什么静态链接的 "hello world"程序这么大(超过 650 KB)?

标签 c static-linking size-reduction binary-size

考虑以下程序:

#include <stdio.h>
int main(void)
{
  printf("hello world\n");
  return 0;
}

如果我使用 GCC 构建它,优化大小并使用静态链接,然后剥离它以进一步减小大小(可能):

$ gcc -Os -static hello.c -o hello
$ strip hello

我得到一个大小约为 695 KB 的可执行文件。

为什么这么大?我意识到这不只是我的目标代码,还有 stub 和其他东西,但仍然有点庞大。

注意事项:

  • 操作系统:Devuan GNU/Linux Chimaera(~= Debian Bullseye)
  • 编译器:GCC 10.2
  • libc: glibc 2.31-13
  • 处理器架构:x86_64
  • 如果我使用 -O3 -flto 构建它并没有改善。

最佳答案

部分答案:可执行文件的膨胀大小......

  • 与您对printf的使用有任何关系吗? .
  • 与编译器优化代码的能力有什么关系。
  • 与您包含 <stdio.h> 有任何关系吗? .

为什么?因为即使你编译一个空程序:

int main(void)
{
  return 0;
}

您仍然获得相同的 695 KB 可执行文件。

感谢@SparKot 指出这个方向的评论。

关于c - 为什么静态链接的 "hello world"程序这么大(超过 650 KB)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71755641/

相关文章:

c - 动态类型选择是否会破坏 C 中的严格别名?

c - C中的 "undefined reference to varName"是什么意思?

c++ - C++ 中 libpq++ postgresql 的静态链接

c - 为什么我的解析函数返回不返回所有预期的标记?

c - 如何在c中打印带填充的空间

llvm - 如何将 libstdc++ 与 clang++ 静态链接

c++ - 哪些选项(如果有)在 Visual Studio 2015 中暗示/CLR

mysql - 为什么从 VARCHAR 列中剥离一些数据后,MySQL MyISAM 表的大小相同?

arrays - Julia:获取多维数组沿特定轴的范围(最小值/最大值)

c++ - 优化析构函数的大小