链接器映射文件符号大小计算及内存填充疑问
先看你提供的.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

