目录
1 几个问题
1.1 什么是map文件
1.2 如何查看编译出的程序和数据的信息
1.3 如何生成map文件
1.4 map文件里面有哪些信息
2 map文件信息详解
2.1 Section Cross References
2.2 Removing Unused input sections from the image
2.3 Image Symbol Table
2.4 Memory Map of the image
2.4.1 几个重点部分
2.4.1 详细内容标题
2.5 Image component sizes
map文件就是通过编译器编译之后,程序、数据及IO空间的一种映射文件。
一般情况下,遇到内存越界,或者是溢出等情况,可以先进行map文件的分析。因为从map文件,可以了解到一些函数的大小,以及其入口等等重要信息。
以上的编译log即能表现出编译出的程序和数据的信息,其实这些数据都是一些单模块的汇总,在map文件里面都有详细描述。
需要对输出信息进行配置,接下来对工程进行百编译,即可生成map文件
主要包含配置:
Memory Map:内存映射
Callgraph:图像映射
Symbols:符号
Cross Reference:交叉引用
Size Info:大小信息
Totals Info:统计信息
Unused Section Info:未调用模块信息
Veneers Info:装饰信息
具体操作见下图:Project -> Options for Target -> Listing
从以上输出配置能得出来map文件大概包含了哪些信息。map文件将其中的信息分为如下五大类:
模块 | 信息 |
Section Cross References | 模块、段(入口)交叉引用 |
Removing Unused input sections from the image | 移除未调用模块 |
Image Symbol Table | 映射符号表 |
Memory Map of the image | 内存(映射)分布 |
Image component sizes | 存储组成大小 |
模块、段(入口)交叉引用:指的是各个源文件生成的模块、段(定义的入口)之间相互引用的关系。
bsp.o(.text) refers to led.o(.text) for LED_Config
解析:bsp模块(bsp.o)中引用(或者说调用)了led模块(led.o)中的LED_Config函数。
移除未调用模块:被调用的模块(或者说函数)会在map文件中生成一个列表。
a:Removing system_stm32f10x.o(.constdata), (20 bytes).
b: unused section(s) (total 8927 bytes) removed from the image.
解析:
a:system_stm32f10x文件未被调用,代码大小为20字节;
b:总共有8个没有调用的模块,没有被调用的大小为8927字节;
映射符号表:各个段所存储对应地址的表。
其中对于各信息标题的说明如下:
几个要点:
1 大家会发现有0x0800xxxx、0x2000xxxx这样的地址。
0x0800xxxx指存储在FLASH里面的代码、变量等。
0x2000xxxx指存储在内存RAM中的变量Data等
2 符号类型
大概有几种:Number、Section、Thumb Code、Data等;
全局、静态变量等位于0x2000xxxx的内存RAM中。
内存(映射)分布,这块内容较多,将会分为几个部分进行说明。
存储组成大小:主要就是对模块进行汇总存储大小信息。
回到文章开头截图的编译结果:
解析
关系如下:
RO Size = Code + RO Data