KEIL MDK輸出map文件分析01
前面寫了一篇文章對__main函數(shù)的執(zhí)行過程做了一個(gè)粗略的跟蹤描敘,對一個(gè)燒錄了程序的STM32開發(fā)板從啟動(dòng)復(fù)位到進(jìn)入用戶main函數(shù)的過程有了一個(gè)大概的了解,但是有很多問題感覺還是模模糊糊,因此,今天又把KEIL MDK編譯、鏈接后生成的map文件簡單分析一下,加深對鏈接器、嵌入式系統(tǒng)可執(zhí)行映像特點(diǎn)的了解。、
本文引用地址:http://m.butianyuan.cn/article/201611/322727.htm一、文件分析流程
1、第一部分:Section Cross References
主要是各個(gè)源文件生成的模塊之間相互引用的關(guān)系。
stm32f10x.o(STACK) refers (Special) to stkheap2.o(.text) for __use_two_region_memory
比如上面這句話,stm32f10x.o是stm32f10x.s生成的目標(biāo)文件模塊,(STACK)是文件內(nèi)定義的一個(gè)段,鏈接器把它視為一個(gè)Section,輸入節(jié)。它引用了模塊stkheap2.o輸入節(jié)(.text)里面的一個(gè)全局符號(hào)__use_two_region_memory(可能是一個(gè)函數(shù)或變量)。這個(gè)(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
上面這幾個(gè)對于程序意義比較重大用戶在啟動(dòng)代碼中調(diào)用了__main.o模塊中的__main函數(shù),__main又調(diào)用了kernel.o中的__rt_entry函數(shù),最后kernel.o又調(diào)用了用戶定義的main主函數(shù)。
2、第二部分:Removing Unused input sections from the image.
就是將庫中沒有用到的函數(shù)從可執(zhí)行映像中刪除掉,減小程序的體積。
Removing os_sem.o(.text), (1016 bytes).
3、第三部分:Image Symbol Table
Local Symbols
符號(hào)表里的局部符號(hào)。
../../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
全局符號(hào)
這些是一些系統(tǒng)的全局符號(hào)
Region
Region
后面這兩個(gè)符號(hào)我認(rèn)為很重要,在運(yùn)行庫代碼將可執(zhí)行映像從加載視圖轉(zhuǎn)變?yōu)榭蓤?zhí)行視圖的過程中起到了關(guān)鍵作用。Number是指它并不占據(jù)程序空間,而只是一個(gè)具有一定數(shù)值的符號(hào),類似于程序中用define和EQU定義的。所以這里,我先放下map文件的分析,先通過仿真調(diào)試,看這兩個(gè)數(shù)值在程序中怎么用。
評(píng)論