为什么我的二进制文件比我的目标文件小得多?

时间:2012-08-17 22:06:26

标签: gcc compilation linker elf

我正在使用GCC 4.7编译一个只包含一个C ++源文件的大型应用程序,因此只有一个编译单元,但它包含许多长标题。最终优化的可执行文件myapp为40MB,但优化的目标文件myapp.o为101MB。目标文件如何大于二进制文件?

我运行了“nm -AC myapp”和“nm -AC myapp.o”,看看是否有一个比另一个更多的符号 - 大约有1000个符号差异,但它们大部分都是你想要的二进制文件添加标准异常处理和静态init的符号。

然后我在两个地方都运行'readelf -a'并为myapp.o获得了这个:

Number of section headers:         29186
Section header string table index: 29183

但是对于myapp:

Number of section headers:         40
Section header string table index: 37

所以我猜这是因为尺寸差异,但我实际上并不知道这意味着什么,或者如何减小尺寸。我吠叫错了树吗?我的目标是让myapp的编译时间缩短,但首先我需要了解什么是错误的。如果符号是问题,我可以使用GCC的-fvisibility = hidden选项进行研究,但如果出现这个问题,我预计会有更多的nm差异。

编辑:其他信息,我的源文件中未定义的所有内容都来自动态链接的库。

1 个答案:

答案 0 :(得分:3)

目标文件包含许多额外信息,以允许将单独的文件链接在一起。此外,一旦项目中的所有目标文件链接在一起,就可以优化许多代码。 (例如,未调用的库例程可能包含在目标文件中,但一旦编译器知道哪些例程将在最终二进制文件中实际使用,则不需要。