GCC 的 size 程序正是您所寻找的。p>
size 可以传递完整编译的.elf 文件。默认情况下,它会输出如下内容:
$ size linked-file.elf
text data bss dec hex filename
11228 112 1488 12828 321c linked-file.elf
这是说:
此文件的.text“部分”中有11228 字节。这通常用于函数。
有112字节的初始化数据:程序中有初始值的全局变量。
有1488字节的未初始化数据:没有初始值的全局变量。
dec 只是前 3 个值的总和:11228 + 112 + 1488 = 12828。
hex 只是 dec 值的十六进制表示:0x321c == 12828。
对于嵌入式系统,通常dec 需要小于目标设备的闪存大小(或设备上的可用空间)。
通常只需观察 GCC 的 size 命令的 dec 或 text 输出,即可随着时间的推移监控已编译代码的大小。大小的大幅跳跃通常表明新功能实现不佳或 constexpr 没有被编译掉。 (别忘了function-sections 和data-sections)。
注意:对于 AVR,您需要使用 avr-size 检查 AVR .elf 文件的链接大小。 avr-size 需要一个目标芯片的额外参数,并会自动计算您选择的芯片的已用闪存百分比。
GCC 的size 也可以直接作用于中间对象文件。
如果您想检查函数的编译大小,这特别有用。
你应该会看到类似这样的摘录:
$ size -A main.cpp.o
main.cpp.o :
section size addr
.group 8 0
.group 8 0
.text 0 0
.data 0 0
.bss 0 0
.text._Z8sendByteh 8 0
.text._ZN3XMC5IOpin7setModeENS0_4ModeE 64 0
.text._ZN7NamSpac6OptionIN5Clock4TimeEEmmEi 76 0
.text.Default_Handler 24 0
.text.HardFault_Handler 16 0
.text.SVC_Handler 16 0
.text.PendSV_Handler 16 0
.text.SysTick_Handler 28 0
.text._Z5errorPKc 8 0
.text._ZN7NamSpac5Motor2goEi 368 0
.text._ZN7NamSpac5Motor3getEv 12 0
.rodata.cst1 1 0
.text.startup.main 632 0
.text._ZN7NamSpac7Program3runEv 380 0
.text._ZN7NamSpac8Position4tickEv 24 0
.text.startup._GLOBAL__sub_I__ZN7NamSpac7displayE 292 0
.init_array 4 0
.bss._ZN5Debug9formatterE 4 0
.rodata._ZL10dispDigits 8 0
.bss.position 4 0
.bss.motorState 4 0
.bss.count 4 0
.rodata._ZL9diameters 20 0
.bss._ZN7NamSpac8diameterE 16 0
.bss._ZN5Debug3pinE 12 0
.bss._ZN7NamSpac7displayE 24 0
.rodata.str1.4 153 0
.rodata._ZL12dispSegments 32 0
.bss._ZL16diametersDisplay 10 0
.bss.loadAggregate 4 0
.bss.startCount 4 0
.bss._ZL15runtimesDisplay 10 0
.bss._ZN7NamSpac7runtimeE 16 0
.bss.startTime 4 0
.rodata._ZL8runtimes 20 0
.comment 111 0
.ARM.attributes 49 0
Total 2494