GCC中--print-memory-usage参数的工作机制及内存区域占用拆解
GCC中
--print-memory-usage参数的工作原理与内存区域拆解 一、工作原理
--print-memory-usage本质是链接器ld的参数(GCC需通过-Wl,--print-memory-usage格式传递给链接器),核心作用是在链接完成后输出目标文件的内存占用统计结果。
- 链接过程中,ld会依据链接脚本的定义,将编译生成的各个段(如
.text、.data、.bss等)分配到指定的物理内存区域; - 启用该参数后,ld会在内存分配流程结束后,遍历自身维护的「内存区域-段」映射关系表,统计每个区域的总大小、已用空间(所有映射到该区域的段大小之和)、剩余空间;
- 最后将这些统计数据格式化输出,帮助开发者快速掌握固件或可执行文件的内存使用概况。
二、对链接脚本内存区域的拆解方式
链接脚本通过MEMORY块定义系统的物理内存区域,再通过SECTIONS指令将具体段映射到这些区域,--print-memory-usage的统计完全基于这两部分的定义逻辑:
链接脚本的内存定义基础
典型的内存区域定义示例:MEMORY { FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K }这里定义了两个内存区域:支持读、执行的FLASH(起始地址0x08000000,大小128KB),以及支持读、写、执行的RAM(起始地址0x20000000,大小20KB)。
段到内存区域的映射规则
链接脚本的SECTIONS部分会指定各个段的归属,示例如下:SECTIONS { .text : { *(.text) } > FLASH .rodata : { *(.rodata) } > FLASH .data : { *(.data) } > RAM AT> FLASH .bss : { *(.bss) } > RAM }这段脚本将代码段
.text、只读数据段.rodata分配到FLASH,初始化全局变量段.data、未初始化全局变量段.bss分配到RAM。统计拆解的具体逻辑
当使用--print-memory-usage时,ld会执行以下操作:- 逐个遍历
MEMORY块中定义的每个内存区域; - 对每个区域,累加所有映射到它的段的大小,得到该区域的已用空间;
- 用区域总大小减去已用空间,计算出剩余空间;
- 最终输出类似如下的统计结果(不同版本ld格式可能略有差异):
Memory region Used Size Region Size %age Used FLASH: 12345 B 128 KB 9.38% RAM: 6789 B 20 KB 33.19% - 若需要更细致的段级拆解,可配合
-M参数生成内存映射文件,文件中会列出每个段在对应内存区域的具体大小和地址范围。
- 逐个遍历
内容的提问来源于stack exchange,提问作者sahil patidar
相关产品推荐
相关产品推荐

