使用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
答案 0 :(得分:4)
有一个非常明显的ld选项叫做-print-gc-sections来查看被抛出的内容。
我从未找到过跟踪符号依赖关系的方法,但最终不需要查看-print-gc-sections。
我发现this描述了“神奇的部分”,我想这与我所看到的相似。有许多自定义链接器部分被错误地丢弃,我使用KEEP来防止这些gc,虽然我确定现在没有删除死代码,但这可能是我能做的最好的。