是否可以指示 GNU ld 打印链接期间需要哪些 .o 文件

Can GNU ld be instructed to print which .o files are needed during a link?

本文关键字:文件 链接 指示 GNU 打印 ld 是否      更新时间:2023-10-16

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

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

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

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

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