新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > KEIL MDK输出map文件分析01

KEIL MDK输出map文件分析01

作者: 时间:2016-11-28 来源:网络 收藏
前言

前面写了一篇文章对__main函数的执行过程做了一个粗略的跟踪描叙,对一个烧录了程序的STM32开发板从启动复位到进入用户main函数的过程有了一个大概的了解,但是有很多问题感觉还是模模糊糊,因此,今天又把KEIL MDK编译、链接后生成的map文件简单分析一下,加深对链接器、嵌入式系统可执行映像特点的了解。、

本文引用地址:https://www.eepw.com.cn/article/201611/322727.htm

一、文件分析流程


1、第一部分:Section Cross References

主要是各个源文件生成的模块之间相互引用的关系。

stm32f10x.o(STACK) refers (Special) to stkheap2.o(.text) for __use_two_region_memory

比如上面这句话,stm32f10x.o是stm32f10x.s生成的目标文件模块,(STACK)是文件内定义的一个段,链接器把它视为一个Section,输入节。它引用了模块stkheap2.o输入节(.text)里面的一个全局符号__use_two_region_memory(可能是一个函数或变量)。这个(Special)不知道是什么含义。

剩下的基本都是这用的意思。

stm32f10x_vector.o(.text) refers to __main.o(!!!main) for __main

__main.o(!!!main) refers to kernel.o(.text) for __rt_entry

kernel.o(.text) refers to usertask.o(.text) for main

上面这几个对于程序意义比较重大用户在启动代码中调用了__main.o模块中的__main函数,__main又调用了kernel.o中的__rt_entry函数,最后kernel.o又调用了用户定义的main主函数。

2、第二部分:Removing Unused input sections from the image.

就是将库中没有用到的函数从可执行映像中删除掉,减小程序的体积。

Removing os_mbox.o(.text), (1094 bytes).

Removing os_mutex.o(.text), (1744 bytes).

Removing os_sem.o(.text), (1016 bytes).

3、第三部分:Image Symbol Table

Local Symbols


符号表里的局部符号。


../../angel/boardlib.s0x00000000Number0boardinit1.o ABSOLUTE


../../angel/handlers.s0x00000000Number0__scatter_copy.o ABSOLUTE


../../angel/kernel.s0x00000000Number0kernel.o ABSOLUTE


../../angel/rt.s0x00000000Number0rt_raise.o ABSOLUTE


../../angel/scatter.s0x00000000Number0__scatter.o ABSOLUTE


../../angel/startup.s0x00000000Number0__main.o ABSOLUTE


../../angel/sys.s0x00000000Number0sys_exit.o ABSOLUTE


../../angel/sysapp.c0x00000000Number0sys_wrch.o ABSOLUTE


../../armsys.c0x00000000Number0_get_argv.o ABSOLUTE


../../division_7m.s0x00000000Number0rtudiv10.o ABSOLUTE


../../fpinit.s0x00000000Number0fpinit.o ABSOLUTE


../../heapalloc.c0x00000000Number0hrguard.o ABSOLUTE


../../printf.c0x00000000Number0_printf_outstr_char.o ABSOLUTE


../../signal.c0x00000000Number0defsig_exit.o ABSOLUTE


../../stdlib.c0x00000000Number0exit.o ABSOLUTE


../../stkheap.s0x00000000Number0heapext.o ABSOLUTE


以上是一些系统内部的局部符号,还有用户的一些局部符号



4、第四部分:Global Symbols


全局符号


_terminate_user_alloc- Undefined Weak Reference


_terminateio- Undefined Weak Reference


__Vectors0x08000000Data4stm32f10x_vector.o(RESET)


__main0x08000131Thumb Code8__main.o(!!!main)


__scatterload0x08000139Thumb Code0__scatter.o(!!!scatter)


__scatterload_rt20x08000139Thumb Code44__scatter.o(!!!scatter)


这些是一些系统的全局符号


Font8x160x08001a82Data2048tft018.o(.constdata)


Font8x80x08002282Data2056tft018.o(.constdata)


codeGB_160x08002a8aData770tft018.o(.constdata)


Region

Table
Base0x08002dc0Number0anon
obj.o(Region
Table)

Region

Table
Limit0x08002de0Number0anon
obj.o(Region
Table)

后面这两个符号我认为很重要,在运行库代码将可执行映像从加载视图转变为可执行视图的过程中起到了关键作用。Number是指它并不占据程序空间,而只是一个具有一定数值的符号,类似于程序中用define和EQU定义的。所以这里,我先放下map文件的分析,先通过仿真调试,看这两个数值在程序中怎么用。


上一页 1 2 3 下一页

关键词: KEILMDKmap文

评论


技术专区

关闭