嵌入式C语言–Map文件
嵌入式C语言--Map文件
一. map文件概念
map文件就是通过编译器编译之后,程序、数据及IO空间的一种映射文件。
map文件是linker链接器生成的一种文本文件,用于描述目标文件和可执行文件中包含的符号(函数,全局变量…)和地址信息。它包含了代码和数据在memory中的分布情况,以及它们在可执行文件中的位置和大小等信息。
map文件的格式和结构没有标准化,其内容与使用的微控制器开发工具强相关:不同的编译器和链接器生成的内容,存在不小的差异。
二. map文件的作用
一般情况下,遇到内存越界,或者是溢出等情况,可以先进行map文件的分析。因为从map文件,可以了解到一些函数的大小,以及其入口等等重要信息。
map文件在嵌入式系统开发中非常有用,可以提供许多与程序有关的详细信息,帮助开发人员更好地理解程序的结构和内存使用情况,进而进行程序优化和调试。
三. map文件里面有哪些信息
map文件将其中的信息分为如下五大类:
1)Section Cross References
模块、段(入口)交叉引用:指的是各个源文件生成的模块、段(定义的入口)之间相互引用的关系。
2)Removing Unused input sections from the image
移除未调用模块:被调用的模块(或者说函数)会在map文件中生成一个列表。
3)Image Symbol Table
映射符号表:各个段所存储对应地址的表。
4)Memory Map of the image
内存(映射)分布
5)Image component sizes
存储组成大小:主要就是对模块进行汇总存储大小信息。它具体包括的信息如下:
Code:指代码的大小
Ro-data:指除了内联数据(inline data)之外的常量数据
Rw-data:指可读写(RW)、已初始化的变量数据;
ZI-data:指未初始化(ZI)的变量数据;
Code、Ro-data:位于FLASH中
RW-data、ZI-data:位于RAM中
RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM
四. map文件格式
map文件中包含的Section有以下这几种。
1)TARGET Section
命名目标processor处理器和memory模型。
*********************************************************************************************
TARGET SECTION
---------------------------------------------------------------------------------------------
Processor : Freescale S12Z
Memory Model: SMALL
File Format : ELF\DWARF 2.0
Linker : SmartLinker V-5.0.50 Build 13206, Jul 26 2024
2)FILE Section
列出在Link链接过程中使用或引用object的所有文件的名称。
在大多数情况下,这些名称与linker parameter文件中列在关键字NAMES和END之间的名称相同。
如果一个文件是指ROM library或program,则列出ROM library或program使用的所有object文件,并有缩进。
五. 内存分布
1)text 程序
文字区段(text segment)也称为程序段(code segment),存放可执行命令(instructions)。
2)data:初始化静态变量
初始化数据区段(initialized data segment)存储已经初始化的静态变量,例如有经过初始化的C语言的全局变量(global variables)以及静态变量(static variables),分为RW-data和RO-data。
3)bss(Block Started by Symbol segment)
未初始化静态变量,未初始化的数据。
4)stack:栈(stack segment)
用于存储函数的局部变量,以及各种函数调用时需要存储的信息(比如函数返回的存储器地址、函数状态等),每一次的函数调用就会在栈上建立一个 stack frame(栈帧),存储该次调用的所有数据于状态,这样以来同一个函数被调用多次时,就会有不同栈帧,不会相互干扰。
栈(Stack)一般的状态会从高地址往低地址生长,而 heap 相反。
5)heap
堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减,例如 C 语言的 malloc 以及 C++ 的 new 所建立的变量都是储存于此。