3

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

我运行“nm -AC myapp”和“nm -AC myapp.o”来查看一个符号是否比另一个符号多得多——大约有 1000 个符号差异,但它们大多是你所期望的,比如二进制添加符号用于标准异常处理和静态初始化。

然后我在两者上都运行了“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 会有更多差异。

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

4

1 回答 1

3

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

于 2012-08-17T22:14:27.073 回答