1

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

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

4

1 回答 1

0

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

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

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

于 2012-06-26T17:46:22.443 回答