前语
前面写了一篇文章对__main函数的履行进程做了一个大略的盯梢描叙,对一个烧录了程序的STM32开发板从发动复位到进入用户main函数的进程有了一个大约的了解,但是有许多问题感觉仍是模模糊糊,因而,今日又把KEIL MDK编译、链接后生成的map文件简略剖析一下,加深对链接器、嵌入式体系可履行映像特色的了解。、
一、文件剖析流程
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_sem.o(.text), (1016 bytes).
3、第三部分:Image Symbol Table
Local Symbols
符号表里的部分符号。
../../angel/boardlib.s
../../angel/handlers.s
../../angel/kernel.s
../../angel/rt.s
../../angel/scatter.s
../../angel/startup.s
../../angel/sys.s
../../angel/sysapp.c
../../armsys.c
../../division_7m.s
../../fpinit.s
../../heapalloc.c
../../printf.c
../../signal.c
../../stdlib.c
../../stkheap.s
4、第四部分:Global Symbols
大局符号
这些是一些体系的大局符号
Region
Base
Table)
Region
Limit
Table)
后边这两个符号我以为很重要,在运行库代码将可履行映像从加载视图转变为可履行视图的进程中起到了关键作用。Number是指它并不占有程序空间,而仅仅一个具有必定数值的符号,类似于程序顶用define和EQU界说的。所以这儿,我先放下map文件的剖析,先经过仿真调试,看这两个数值在程序中怎样用。