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

考虑以下程序:

#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# - System.IO.Directory.Exists 在 LINQ 语句中失败,但在 fo

haskell - 在 Haskell 中日志记录功能的不同实现之间切换的有效方法?

java - 如何在 Java 中创建包含运算符的变量?

go - 函数参数的求值顺序是什么?

authentication - 是 CQRS 中的登录/注册命令或查询

c - 在格式控制字符串中使用消息

python - 将列表附加到现有数据框

ios - 在 SwiftUI 中声明 Binding 属性有什么区别?

java - 如何使用 Collectors.collectionAndThen 和 Collect

python - `__ge__` 在 dict.values() 上使用时失败