You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的统计完全基于这两部分的定义逻辑:

  1. 链接脚本的内存定义基础
    典型的内存区域定义示例:

    MEMORY
    {
      FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K
      RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
    }
    

    这里定义了两个内存区域:支持读、执行的FLASH(起始地址0x08000000,大小128KB),以及支持读、写、执行的RAM(起始地址0x20000000,大小20KB)。

  2. 段到内存区域的映射规则
    链接脚本的SECTIONS部分会指定各个段的归属,示例如下:

    SECTIONS
    {
      .text : { *(.text) } > FLASH
      .rodata : { *(.rodata) } > FLASH
      .data : { *(.data) } > RAM AT> FLASH
      .bss : { *(.bss) } > RAM
    }
    

    这段脚本将代码段.text、只读数据段.rodata分配到FLASH,初始化全局变量段.data、未初始化全局变量段.bss分配到RAM。

  3. 统计拆解的具体逻辑
    当使用--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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:01:26