我需要严格优化可执行文件的大小(ARM开发),我注意到在我当前的构建方案(gcc+ ld)中,未使用的符号不会被剥离.
的用法arm-strip --strip-unneeded为生成的可执行文件/库不改变可执行文件的输出大小(我不知道为什么,也许它根本不能).
修改我的构建管道的方式是什么(如果存在),以便从结果文件中删除未使用的符号?
我甚至都不会想到这一点,但我当前的嵌入式环境并不是非常"强大",甚至500K可以节省2M非常好的加载性能.
更新:
不幸的是,gcc我使用的当前版本没有-dead-strip选项,并且-ffunction-sections... + --gc-sectionsfor ld不会对结果输出产生任何显着差异.
我很震惊,这甚至成了问题,因为我确信gcc + ld应该自动删除未使用的符号(为什么他们甚至要保留它们?).
使用AVR-GCC,AVR-LD
我试图通过使用fdata-sections -ffunction-sections和gc-sections来严重减小输出文件的大小。当不使用这些选项进行编译时,我的输出为〜63KB,而使用这些选项则为〜30KB,因此看起来很棒。
不幸的是,在加载和测试输出后,我注意到它无法正常工作。垃圾回收似乎已远远超过了我的预期,并且检查.map时发现有些关键数据不存在。
关于什么原因在链接时会导致这些数据/功能被丢弃?(我意识到这可能是一个我希望提供的细节太少的问题,如果需要任何信息,请询问,我会尽力提供)
有没有办法追踪“未使用”时垃圾回收扔掉了哪些符号?
如果不使用-fdata-sections -ffunction-sections -gc-sections,是否可以跟踪符号依赖关系?(要验证gc-sections仅收集了应该收集的内容)-我注意到这是一个选择,但是使用Verax建议的方法对我来说非常痛苦
编辑:编译器和链接器行
avr-ld -mavrxmega6 -gc-sections -T 链接描述 文件 libgcc.a -o firmware.elf
avr-gcc -Wall -Wstrict原型-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
我想知道为什么 GCC 编译器标志 -ffunction-sections 和链接器标志 --gc-sections 不消除不必要的响应。来自我最终可执行文件的未引用符号/函数代码。为什么它不像 GCC 文档中的预期和描述的那样工作?
可能我监督了一些意外的参考!?
检查已经使用这个非常好的方法:
GCC --gc-sections 并在链接描述文件中使用 /DISCARD/查找符号依赖项。没有成功。没有提到我未使用的功能。
没有机会自动消除死代码!?为什么 ???