我正在使用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差异。
编辑:其他信息,我的源文件中未定义的所有内容都来自动态链接的库。
答案 0 :(得分:3)
目标文件包含许多额外信息,以允许将单独的文件链接在一起。此外,一旦项目中的所有目标文件链接在一起,就可以优化许多代码。 (例如,未调用的库例程可能包含在目标文件中,但一旦编译器知道哪些例程将在最终二进制文件中实际使用,则不需要。