-gc-sections 丢弃使用过的数据
-gc-sections discards used data
使用 avr-gcc、avr-ld
我试图通过使用 fdata-sections -ffunction-sections 和 gc-sections 来大幅减小输出文件的大小。在没有这些选项的情况下编译时,我的输出为 ~63KB,使用这些选项时为 ~30KB,所以看起来很棒。
不幸的是,在加载并测试输出后,我发现它无法正常工作。垃圾收集似乎已经删除了比我预期的要多得多,检查 .map 我发现一些关键数据不存在。
知道 link 是什么导致这些 data/functions 被丢弃吗? (我意识到这个问题可能太有希望了,因为我提供的细节太少了,如果需要任何信息,请询问,我会尽力提供)
有没有办法追踪哪些符号被垃圾收集器按原样丢弃"unused"?
在不使用 -fdata-sections -ffunction-sections -gc-sections 的情况下,我可以跟踪符号依赖关系吗? (验证 gc-sections 只收集了它应该收集的东西)
- 我注意到 this 这是一个选项,但使用 Verax
建议的方法对我来说会非常痛苦
编辑:编译器和 linker 行
avr-ld -mavrxmega6 -gc-sections -Tlinkerscript files 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
有一个非常明显的名为 -print-gc-sections 的 ld 选项,用于查看被丢弃的内容。
我从来没有找到一种方法来跟踪符号的依赖关系,但最终不需要查看 -print-gc-sections。
我发现 this 描述了 "magic sections",我想这与我所看到的相似。有许多自定义链接器部分被错误丢弃,我使用 KEEP 来防止这些部分的 gc,虽然我确定现在没有删除死代码,但这可能是我能做的最好的。
使用 avr-gcc、avr-ld
我试图通过使用 fdata-sections -ffunction-sections 和 gc-sections 来大幅减小输出文件的大小。在没有这些选项的情况下编译时,我的输出为 ~63KB,使用这些选项时为 ~30KB,所以看起来很棒。
不幸的是,在加载并测试输出后,我发现它无法正常工作。垃圾收集似乎已经删除了比我预期的要多得多,检查 .map 我发现一些关键数据不存在。
知道 link 是什么导致这些 data/functions 被丢弃吗? (我意识到这个问题可能太有希望了,因为我提供的细节太少了,如果需要任何信息,请询问,我会尽力提供)
有没有办法追踪哪些符号被垃圾收集器按原样丢弃"unused"?
在不使用 -fdata-sections -ffunction-sections -gc-sections 的情况下,我可以跟踪符号依赖关系吗? (验证 gc-sections 只收集了它应该收集的东西) - 我注意到 this 这是一个选项,但使用 Verax
建议的方法对我来说会非常痛苦编辑:编译器和 linker 行
avr-ld -mavrxmega6 -gc-sections -Tlinkerscript files 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
有一个非常明显的名为 -print-gc-sections 的 ld 选项,用于查看被丢弃的内容。
我从来没有找到一种方法来跟踪符号的依赖关系,但最终不需要查看 -print-gc-sections。
我发现 this 描述了 "magic sections",我想这与我所看到的相似。有许多自定义链接器部分被错误丢弃,我使用 KEEP 来防止这些部分的 gc,虽然我确定现在没有删除死代码,但这可能是我能做的最好的。