【发布时间】:2015-10-09 20:39:30
【问题描述】:
使用 avr-gcc、avr-ld
我正在尝试通过使用 fdata-sections -ffunction-sections 和 gc-sections 来大幅减小输出文件的大小。在没有这些选项的情况下编译时,我的输出约为 63KB,而使用这些选项时,它的输出约为 30KB,所以看起来很棒。
不幸的是,在加载和测试输出后,我发现它不能正常工作。垃圾收集似乎比我预期的要多得多,检查 .map 我发现一些关键数据不存在。
知道链接时是什么导致这些数据/函数被丢弃吗? (我意识到这可能是一个我提供的细节太少的问题,如果需要任何信息,请询问,我会尽力提供)
有没有办法追踪垃圾收集丢弃了哪些符号,因为它们“未使用”?
如果不使用 -fdata-sections -ffunction-sections -gc-sections,我可以跟踪符号依赖关系吗? (验证 gc-sections 只收集了它应该收集的内容) - 我注意到this这是一个选项,但是使用Verax建议的方法对我来说会很痛苦
编辑:编译器和链接器行
avr-ld -mavrxmega6 -gc-sections -Tlinkerscript 文件 libgcc.a -o firmware.elf
avr-gcc -Wall -Wstrict-prototypes -g -ffunction-sections -fdata-sections -Os -mmcu=atxmega256a3 -fno-jump-tables -std=gnu99 -fpack-struct -fno-common -mcall-prologues -c -o 文件.o 文件.c
【问题讨论】:
-
Verax 的问题在于他使用的是 C++。您声称只使用 C,所以不应该遇到这种情况,但是这个问题仍然没有足够的内容来提供一个好的答案。显示一些细节:向我们提供完整的编译器和链接器行,并准确显示要删除的内容。
-
添加了编译器和链接器行。由于代码非常广泛,究竟要删除的内容仍然未知,我问了一些问题来帮助确定究竟是什么被丢弃了。最后,我指的是 Verax 提到的将每个符号添加到 DISCARD 并使用错误输出来跟踪引用符号的位置的方法。
-
您是否使用这些选项编译了所有代码?如果有没有这些选项的全局变量,并且您没有在链接描述文件中添加标准部分,这可能是造成问题的原因。 OTOH,如果丢弃使用过的符号,ld 至少应该发出警告。
-
所有代码都是使用这些选项编译的,是的。全球人?如果您指的是标准部分(.text、.data、.bss),则它位于链接描述文件中,并且 ld 没有给出丢弃已用符号的警告。
-
只是猜测:如果没有这样声明,中断处理程序可能会丢失。
标签: c garbage-collection avr-gcc