【问题标题】:Can GNU LD print memory usage by memory space, rather then just as a bulk percentage?GNU LD 可以按内存空间打印内存使用情况,而不是按批量百分比吗?
【发布时间】:2026-02-07 22:50:01
【问题描述】:

我正在 ARM mcu 上开发一个嵌入式项目,该项目有一个自定义链接器文件,其中包含多个不同的内存空间:

/* Memory Spaces Definitions */
MEMORY
{
  rom      (rx)  : ORIGIN = 0x00400000, LENGTH = 0x00200000
  data_tcm (rw)  : ORIGIN = 0x20000000, LENGTH = 0x00008000
  prog_tcm (rwx) : ORIGIN = 0x00000000, LENGTH = 0x00008000
  ram      (rwx) : ORIGIN = 0x20400000, LENGTH = 0x00050000
  sdram    (rw)  : ORIGIN = 0x70000000, LENGTH = 0x00200000
}

具体来说,我有许多具有不同特性的不同存储设备(TCM、普通 RAM(带有 D-Cache)和外部 SDRAM),它们都映射为同一地址空间的一部分。

我特意在不同的内存空间中放置了不同的变量,具体取决于要求(我是 DMA 进入它,我是否有缓存一致性问题,我是否希望溢出 D 缓存等等。 .).

如果我超出任何一个部分,我会收到链接器错误。但是,除非我这样做,否则链接器只会将内存使用情况打印为批量百分比:

            Program Memory Usage    :   33608 bytes   1.6 % Full
            Data Memory Usage       :   2267792 bytes   91.1 % Full

鉴于我有 3 个积极使用的内存空间,并且我知道我正在使用其中一个(SDRAM)的 100%,这是一种无用的输出。

有没有办法让链接器分别输出每个内存空间的使用百分比?现在,我必须手动打开.map 文件,搜索节标题,然后手动从.ld 文件中指定的总可用内存中减去大小。

虽然这是一件小事,但让链接器来做肯定会很好:

Program Memory Usage    :   33608 bytes   1.6 % Full
Data Memory Usage       :   2267792 bytes   91.1 % Full
    data_dtcm           :   xxx bytes   xx % Full
    ram                 :   xxx bytes   xx % Full
    sdram               :   xxx bytes   xx % Full

这适用于 GCC-ARM,因此也适用于 GCC-LD。

【问题讨论】:

    标签: c memory linker ld


    【解决方案1】:

    Arrrgh,所以当然,我在问完问题后马上找到了答案:

    --print-memory-usage

    用作-Wl,--print-memory-usage,您会得到以下信息:

        Memory region         Used Size  Region Size  %age Used
                     rom:       31284 B         2 MB      1.49%
                data_tcm:       26224 B        32 KB     80.03%
                prog_tcm:          0 GB        32 KB      0.00%
                     ram:      146744 B       320 KB     44.78%
                   sdram:          2 MB         2 MB    100.00%
    

    【讨论】:

    • 请注意,这似乎不适用于所有版本/工具链。基于 gcc 4.9.2 的GCC Renesas (v.4.9.2.201701) 没有这个选项,令人失望。
    • @ahogen - 看起来这个特殊的标志是在here(2015 年 6 月 10 日)添加的,这将在 GCC 4.9.3 发布之前,但在 4.9.2 之后。 可能可以自己构建,补丁非常少。
    • 已更正patch link
    最近更新 更多