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

链接器映射文件符号大小计算及内存填充疑问

链接器映射文件分析疑问解答

先看你提供的.text段映射内容:

.text           0x08000400    0x14ba0
                0x08000400                . = ALIGN (_flash_alignment)
 *(.text)
 .text          0x08000400       0x40 .../lib/gcc/arm-none-eabi/10.3.1/thumb/v7e-m+dp/hard/crtbegin.o
 .text          0x08000440     0x5ee4 .../lib/gcc/arm-none-eabi/10.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m+dp/hard\libstdc++.a(cp-demangle.o)
                0x0800623c                __cxa_demangle
                0x08006300                __gcclibcxx_demangle_callback

结合amap工具的分析结果(__cxa_demangle大小196字节,__gcclibcxx_demangle_callback大小24096字节,两者之和恰好等于cp-demangle.o的.text段总大小0x5ee4),解答你的两个疑问:

1. __gcclibcxx_demangle_callback的大小计算方式

你通过段结束地址减去符号起始地址得到的0x24字节,只是该符号从0x08006300到段末尾的部分,但amap的计算逻辑是将目标文件整个.text段的大小,减去其他已识别全局符号的大小,剩余部分全部归为该符号的大小。

cp-demangle.o的.text段总大小是0x5ee4(24292字节),减去__cxa_demangle的196字节后,剩余的24096字节就被amap算入__gcclibcxx_demangle_callback的大小。这是因为cp-demangle.o中除了这两个全局符号,还有大量静态内部函数(仅在文件内部调用),这些代码属于__gcclibcxx_demangle_callback的实现依赖,链接器映射文件默认不会列出静态符号,amap则将这些未明确标记的代码全部归到该符号名下。

2. 0x08000440到0x0800623c之间的内存内容

这部分内存是cp-demangle.o的.text段中未被映射文件列出的代码,主要是__gcclibcxx_demangle_callback的主体逻辑以及它依赖的静态辅助函数。链接器映射文件仅会列出全局可见的符号,而静态内部函数的地址和大小不会被单独标注,所以这部分内容在映射文件中没有明确显示,但它们确实属于cp-demangle.o的代码段,也是amap将其算入__gcclibcxx_demangle_callback大小的原因。

另外,0x08006300到0x08006324(段结束地址)之间的24字节是链接器添加的对齐填充,用于满足_flash_alignment指定的内存对齐规则,这部分也被amap算入了__gcclibcxx_demangle_callback的大小。

内容的提问来源于stack exchange,提问作者Tim Hilt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:42:01