GNU LD 能否按内存 space 打印内存使用情况,而不是仅作为批量百分比?

Can GNU LD print memory usage by memory space, rather then just as a bulk percentage?

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

/* 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
}

具体来说,我有许多具有不同特性的不同存储设备(、普通 RAM(中间有一个 D-Cache)和一个外部 SDRAM),所有这些都映射为一部分相同地址 space.

我专门将不同的变量放在不同的内存 space 中,具体取决于要求(我是否正在使用 DMA,是否有 cache-coherence 问题,我是否期望溢出 D-cache,等等...)。

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

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

鉴于我有 3 个活跃使用的内存 spaces,而且我知道我正在使用其中一个(SDRAM)的 100%,这是一种无用的输出。

有没有办法让链接器分别输出每个内存space的使用百分比?现在,我必须手动打开 .map 文件,搜索 header 部分,然后从 .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。

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%