【问题标题】:c binary file greater than source file [duplicate]c二进制文件大于源文件[重复]
【发布时间】:2015-10-04 06:51:05
【问题描述】:

我有一个名为 simple.c 的 c 源文件(文件大小 68 字节),我使用 gcc 编译它。输出二进制文件大小为 7151 字节

C源代码:

int main()
{
    int a = 10;
    int b = 34;
    int c = a + b;
    return c;
}

我没有包含任何头文件。

我不知道,C 二进制文件是如何变得比源文件大的。谁能解释一下?

test@test-desktop:~/Desktop/c$ ls -l
total 4
-rw-rw-r-- 1 test test 68 Jul 15 15:04 simple.c
test@test-desktop:~/Desktop/c$ gcc simple.c 
test@test-desktop:~/Desktop/c$ ls -l
total 12
-rwxrwxr-x 1 test test 7151 Jul 15 15:04 a.out
-rw-rw-r-- 1 test test   68 Jul 15 15:04 simple.c

以上是终端输出。

【问题讨论】:

  • 在上述问题中,他们有#included 标准头文件。但是,我没有包含任何头文件。
  • main 不是第一个被调用的函数。编译器在 main 周围添加了一些包装器,然后调用 main。该包装器需要空间。
  • 我会接受你的观点@WernerHenze。可以发个参考链接吗?
  • 源输入大小和可执行输出大小之间没有联系。证明 #1:删除源代码中的所有可选空格。可执行文件的大小将与现在相同。证明 #2:在每个语句之间添加 long cmets。可执行文件的大小相同。
  • @Valarpirai 我没有可用的链接,但是“crt startup”是谷歌的一个很好的组合,可能添加你特定的编译器 gcc。

标签: c gcc binary


【解决方案1】:

即使不包含任何内容,您也会有一定的一次性开销。在main() 之前运行代码(正在设置stdinstdoutstderrsignal handler 表等),并且在该函数返回之后运行代码(例如检查在@987654322 注册的任何内容@ 和类似的东西)。这称为 C 运行时,传统上位于 crt0.o,可链接到任何可执行文件。

【讨论】:

    【解决方案2】:

    它将是调试和符号信息。优化和剥离:

    1. 使用gcc -Os 优化最小尺寸。
    2. 使用strip a.out 删除符号和调试信息。

    还有 CRT 启动文件提供处理 argc、argv 等并设置环境的大部分二进制文件。您可以使用-nostartfiles 选择退出,但您可能不想这样做。

    【讨论】:

    • 优化这段代码?严重地?这应该如何影响输出大小?
    • ...这些都没有真正回答可执行文件如何大于比源代码的问题。
    • @Werner。审查装配。优化将 main 从 10 条指令减少到 1 条(不包括 ret)。
    • ...still 没有回答为什么二进制文件比源文件大了一个舒适的边距。你错过了问题的重点。
    • 好的,所以我添加了大容量的真正原因(CRT 启动开销)
    猜你喜欢
    • 2012-07-08
    • 2012-09-28
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 2015-04-08
    相关资源
    最近更新 更多