嵌入式C语言--Map文件

本文详细介绍了嵌入式C语言中Map文件的概念、作用,包括其内容结构(如SectionCrossReferences、ImageSymbolTable等)、内存分布(如text程序、data、bss和heap)以及文件格式(如TARGETSection和FILESection)。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 所建立的变量都是储存于此。

您可能感兴趣的与本文相关的镜像

GPT-oss:20b

GPT-oss:20b

图文对话
Gpt-oss

GPT OSS 是OpenAI 推出的重量级开放模型,面向强推理、智能体任务以及多样化开发场景

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值