【发布时间】:2015-10-13 15:10:05
【问题描述】:
我正在尝试整理一个嵌入式项目,其中开发人员选择将所有 h 和 c 文件包含到一个 c 文件中,然后他们可以使用 -whole-program 选项编译该文件以获得良好的大小优化.
我讨厌这个,并决心把它变成一个传统的程序,只使用 LTO 来达到同样的效果。
开发套件中包含的版本是; aps-gcc (GCC) 4.7.3 20130524 (Cortus) GNU ld (GNU Binutils) 2.22
一个 .o 文件 .text 为 0x1c7ac,分成 67 个 .o 文件 .text 出来为 0x2f73c,我添加了 LTO 内容并将其减少到 0x20a44,很好但还远远不够。
我已经尝试过 --gc-sections 并使用链接器插件选项,但他们没有进一步改进。
任何建议,我是否看到了 LTO 的正确改进?
【问题讨论】:
-
升级工具链版本是一种选择吗?
-
我打算提出同样的建议,IIRC 更高版本的 GCC 在 LTO 领域做出了显着改进。此外,使用配置文件反馈来进一步减小可执行文件大小。当然,用
-Os编译。 -
为什么不制作一个在编译时创建单个大文件的工具,在为最终生产进行编译时。这就是 sqlite 团队所做的
-
正在努力升级,对于免费工具来说非常困难,宣传册表明 4.9.1 即将推出。
-
我有一个想法,我可以运行双重构建,发布编译包含所有内容的东西,独立调试构建对象。到目前为止,当我破坏代码时,我因目标内存不足而感到困惑,所以我无法在重构时继续测试。这一切都因为代码继续作为一个巨大的整体块的开发而变得困难,每个单独的 C 文件都会看到之前解析的那些文件的包含,因此各个文件的编译方式不同或根本不独立。