我的基于 ARM 的应用程序报告超过 1,250,000 字节的程序内存,但其中大部分是 .rodata(“只读常量”)而不是代码。我在 .map 文件中找到了这个:
.rodata%268 0x00407318 0xe0b38
.rodata 0x00407318 0xe0b38 ..\src\packs\CMSIS\CMSIS\DSP\Lib\GCC\libarm_cortexM7lfdp_math.a(commontables.o)
0x00407318 arm_rfft_sR_q15_len8192
0x00407330 arm_rfft_sR_q15_len4096
0x00407348 arm_rfft_sR_q15_len2048
0x00407360 arm_rfft_sR_q15_len1024
0x00407378 arm_rfft_sR_q15_len512
0x00407390 arm_rfft_sR_q15_len256
...
链接器似乎正在为 CMSIS DSP 库拖动 0xeb038 (962616) 字节的 RO 数据。是否有一个链接器选项(或其他一些技术)只能加载所使用的表?
是否有一个链接器选项只能加载所使用的表
是的,这就是链接器默认执行的操作!
您真正的问题应该是:“为什么这些东西(我认为未使用过)最终会出现在我的二进制文件中”?
要回答这个问题,您可以使用链接器
-y
标志。来自man ld
:
-y symbol
--trace-symbol=symbol
Print the name of each linked file in which symbol appears.
因此,如果您使用
-Wl,-y,arm_rfft_sR_q15_len8192
重新链接二进制文件,您将找到哪个代码(哪个其他符号)使用该符号。对其他符号重复此操作,您最终会找到导致 arm_rfft_sR_q15_len8192
被链接的代码。
附注这里很好地描述了与档案库的链接如何工作。