-gc-sections丢弃使用过的数据

时间:2015-07-20 16:11:24

标签: c garbage-collection avr-gcc

使用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 -T linkerscript 文件 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 file.o file.c

1 个答案:

答案 0 :(得分:4)

有一个非常明显的ld选项叫做-print-gc-sections来查看被抛出的内容。

我从未找到过跟踪符号依赖关系的方法,但最终不需要查看-print-gc-sections。

我发现this描述了“神奇的部分”,我想这与我所看到的相似。有许多自定义链接器部分被错误地丢弃,我使用KEEP来防止这些gc,虽然我确定现在没有删除死代码,但这可能是我能做的最好的。