相关疑难解决方法(0)

如何用GCC和ld删除未使用的C/C++符号?

我需要严格优化可执行文件的大小(ARM开发),我注意到在我当前的构建方案(gcc+ ld)中,未使用的符号不会被剥离.

的用法arm-strip --strip-unneeded为生成的可执行文件/库不改变可执行文件的输出大小(我不知道为什么,也许它根本不能).

修改我的构建管道的方式是什么(如果存在),以便从结果文件中删除未使用的符号?


我甚至都不会想到这一点,但我当前的嵌入式环境并不是非常"强大",甚至500K可以节省2M非常好的加载性能.

更新:

不幸的是,gcc我使用的当前版本没有-dead-strip选项,并且-ffunction-sections... + --gc-sectionsfor ld不会对结果输出产生任何显着差异.

我很震惊,这甚至成了问题,因为我确信gcc + ld应该自动删除未使用的符号(为什么他们甚至要保留它们?).

c c++ gcc strip ld

107
推荐指数
10
解决办法
10万
查看次数

-gc-sections丢弃使用的数据

使用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

c garbage-collection avr-gcc

5
推荐指数
1
解决办法
4720
查看次数

为什么 GCC --gc-sections 和 -ffunction-sections 不起作用?(cmake 构建)

我想知道为什么 GCC 编译器标志 -ffunction-sections 和链接器标志 --gc-sections 不消除不必要的响应。来自我最终可执行文件的未引用符号/函数代码。为什么它不像 GCC 文档中的预期和描述的那样工作?

可能我监督了一些意外的参考!?
检查已经使用这个非常好的方法: GCC --gc-sections 并在链接描述文件中使用 /DISCARD/查找符号依赖项。没有成功。没有提到我未使用的功能。

没有机会自动消除死代码!?为什么 ???

c c++ gcc cmake ld

2
推荐指数
1
解决办法
2342
查看次数

标签 统计

c ×3

c++ ×2

gcc ×2

ld ×2

avr-gcc ×1

cmake ×1

garbage-collection ×1

strip ×1