一、 MDK 编译的过程文件
1. .o或 .obj文件
.c 或 .cpp、.s 源文件经过编译后生成的目标文件。目标文件包含了编译后的机器代码,但还不能直接执行。这些目标文件里包含了源文件中函数和变量的定义(除了外部引用的部分),是链接过程的重要输入。
2. .axf 文件
ELF(Executable and Linkable Format)或 AXF(ARM Cross - reference File)文件是一种可执行文件格式,包含了程序的机器代码、数据段、符号表等信息。这个文件可以被调试器(如 MDK 自带的调试器)加载,用于调试程序。它是链接器将所有的目标文件(.obj 或.o)以及库文件链接在一起后生成的最终产品。例如,在一个嵌入式系统项目中,.elf 或.axf 文件可以被下载到目标设备(如 ARM 微控制器)的内存中运行。
3. .hex 文件
INTEL HEX格式文件,用于下载到MCU运行,由.axf转换而来。
4. .map 文件
连接器生成的列表文件,它包含了程序的内存映射信息。在 MDK 编译过程中,当链接器将各个目标文件(.obj 或.o)和库文件链接成最终的可执行文件(.elf 或.axf)时,会同时生成.map 文件。这个文件对于理解程序在内存中的布局以及各个模块(如函数、变量等)的存储位置非常重要。
二、 MAP文件浅析
1. MAP文件的组成:
2. MAP 文件里一些基础概念
.Section(段) 是程序在内存中的逻辑划分区域,用于组织程序和数据。
RO(Read - Only) 主要包含程序的指令代码和常量数据,运行时通常不修改,常存于ROM。
RW(Read - Write) 是已初始化的数据段,程序运行时数据可读写,一般存于RAM。
ZI(Zero - Initialized) 对应未初始化的数据段,变量启动时自动初始化为0,存于RAM。
.text(代码段) 存储所有可执行机器指令,CPU从这里读取指令运行,通常存于ROM。
.constdata(常量数据段) 存放程序中不能修改的常量数据,常和.text段一起存于ROM。
.bss(未初始化数据段) 用于存储未初始化的全局和静态变量,启动时自动初始化为0,存于RAM。
.data(已初始化数据段) 存储已初始化的全局和静态变量,存于RAM,程序加载时要加载初始值。
3. .map文件分析实例
要产生.map文件,需要在keil里钩选下列设置:
以上节程序为例,打开项目生成的 .map 文件。
(1)程序段交叉引用关系
以 main.c 为例:
这里的 main.o(.text.main) , 表示 main函数位于 text 段(通常是程序代码,用于存放可执行的机器指令)。
refers to … 表示调用了 HAL_Init函数。
(2)删除映像未使用的程序段
以 HAL_DeInit() 为例:
Removing stm32f4xx_hal.o(.text.HAL_DeInit), (68 bytes).
到项目中搜索可以发现确实没有使用到HAL_DeInit()。
(3)映像符号表
映像符号表里, Local Symbols 是局部符号,Global Symbols是全局符号。
列中的 Type是类型, Size是大小,Value是地址。
以 void MX_GPIO_Init(void) 为例,到局部映像表中可以找到:
对于这个局部函数,在外部也可以调用到,所以在全局映像表中也可以找到它:
(4)内存映像分布表
以 HAL_Init 为例:
0x080007c0 0x080007c0 0x00000036 Code RO 377 .text.HAL_Init stm32f4xx_hal.o
其大小为0x00000036字节, 代码,只读,地址在 0x080007c0。
(5) 映像组件大小
上表 Code是代码量, Object Name是文件名称。
FLASH用到的是 Code+RO Data + RW Data,
在SRAM的,是 RW Data+ZI Data。
在最后面的统计信息里:
Total RW Size,就是SRAM的大小。
Total ROM Size,就是占用的Flash的大小。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/xundh/article/details/144053080
|