是否可以指示GNU在链接期间打印哪些.o文件?

时间:2012-05-14 04:29:08

标签: c++ ld avr avr-gcc

一点背景:我正在尝试为嵌入式传感器系统构建一个AVR二进制文件,并且我的运行接近我的大小限制。我使用了一些外部库来帮助我,但是当每个库编译成一个对象时它们相当大。我想把它们拉成较小的对象,所以只有我需要的功能才能链接到我的程序中。我已经设法通过拆分一个大型库来将二进制大小减少2k。

知道在游戏的每个阶段使用哪些对象会有很多帮助,这样我就可以更有效地分割它们。有没有办法让ld打印出哪些对象链接?

1 个答案:

答案 0 :(得分:0)

我不确定对象级别,但我相信您可以使用CFLAGS="-fdata-sections -ffunction-sections"符号级别解决此问题。 LDFLAGS="-Wl,--gc-sections -Wl,--print-gc-sections"。这应该删除所有未引用符号的代码,并显示删除的符号,如果由于某种原因您决定返回到目标文件级别并且想要识别仅包含已删除符号的目标文件,这可能是有用的。

更准确地说,我引用的编译器标志将要求编译器将每个函数或全局变量放在一个部分中,然后--gc-sections链接器标志将删除所有未使用的部分。可能每个目标文件都包含自己的部分,即使其中的函数都共享一个部分。在这种情况下,链接器标志应该单独执行您要求的操作:消除未使用的整个对象。 gcc手册指出编译器标志会增加对象大小,虽然我希望最终的可执行文件不会受此影响,但我不确定,所以你应该给LDFLAGS="-Wl,--gc-sections在任何情况下都是尝试。

列出的选项名称可能是有用的关键字,可以在stackoverflow上搜索有关如何减小二进制文件大小的其他建议。 gc-sections例如{}目前共有62场比赛。