Keil MDK map文件学习笔记
- map文件组成
- 1.`Section Cross References`段交叉引用
- 2.`Removing Unused input sections from the image`移除无用的段
- 3.`Image Symbol Table`镜像符号表
- 局部符号表
- 全局符号表
- 4.`Memory Map of the image`镜像存储器映射
- ROM区执行域
- RAM区执行域
- 5. `Image component sizes`镜像组件大小
- 用户代码部分的信息汇总
- 库部分的信息汇总
- 固件信息
map文件组成
1.Section Cross References
段交叉引用
记录了各函数段之间的相互调用关系
2.Removing Unused input sections from the image
移除无用的段
此段内容表示移除掉未用用到的段数据,以减小代码体积,比如第一行表示移除堆数据段,因为启动文件中为堆区分配的0x200(512bytes)的空间,而程序中没有用到malloc
或alloc
函数来分配堆内存,因而链接的时候会自动移除该部分的内容。
为了节省程序占用空间大小,配置选项中一定要勾选上上面红框内的选项。勾选上该选项后,可以将用不到的段数据在链接的时候自动移除
注:后面分析使用的map文件和上面分析使用的map文件不一样
3.Image Symbol Table
镜像符号表
镜像符号表包含局部符号表和全局符号表
镜像符号表记录了各函数符号或全局变量符号在执行域空间的位置和大小
局部符号表
主要记录了作用域限定在本文件中的函数和变量。如静态函数的入口地址和代码大小,静态全局变量的地址和大小等信息,
上面两个红框中的内容分别对应于下面的两段代码截图,也从侧面证明了局部标号描述的是静态函数和静态全局变量
全局符号表
上面两个红框中的内容分别对应于全局函数和全局变量,并显示了所在执行域空间的位置和大小。上图中的最后一行记录了栈顶指针所在的位置。
4.Memory Map of the image
镜像存储器映射
程序有两种状态未运行状态和运行状态,这里分别对应加载域和执行域。程序默认是烧录到FLASH(ROM)空间的,程序未运行是此时的空间便成为加载域空间。程序运行时代码段和只读数据依旧在FLASH中,RW Data和ZIData Heap Stack等都会加载到SRAM(RAM)中,这是的代码空间称为执行域。
ROM区执行域
ROM区执行域的结束位置应为0x08020000+0x00010500=0x08030500。在下面的具体数据中根据类型(Type)和属性(Attr)可知:Code表示代码段,Data表示常量数据段。在上图最后一行数据中0x080304e0+0x00000020=0x08030500。此段描述的便是ROM区完整的执行域的内容,包括代码段和只读数据段
RAM区执行域
RAM区执行域记录了从FLASH向SRAM加载数据的内容,且加载的起始地址刚好就是ROM区执行域结束的地址,从flash的0x08030500位置开始加载数据,加载大小为0x000069b0大小的数据到RAM空间(上图最后一行0x200049b0+0x2000=0x200069b0)。这里要注意的是并非直接从0x08030500直接向后复制0x000069b0大小的数据到RAM中,实际是根据FLASH空间中的0x08030500后面的部分数据和之前的分散加载表等内容在RAM中生成的0x69b0空间。
5. Image component sizes
镜像组件大小
汇总固件的大小信息
用户代码部分的信息汇总
库部分的信息汇总
固件信息