我正在使用 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 会有更多差异。
编辑:附加信息,我的源文件中未定义的所有内容都来自动态链接的库。