新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > KEIL MDK輸出map文件分析01

        KEIL MDK輸出map文件分析01

        作者: 時間:2016-11-28 來源:網絡 收藏
        前言

        前面寫了一篇文章對__main函數的執行過程做了一個粗略的跟蹤描敘,對一個燒錄了程序的STM32開發板從啟動復位到進入用戶main函數的過程有了一個大概的了解,但是有很多問題感覺還是模模糊糊,因此,今天又把KEIL MDK編譯、鏈接后生成的map文件簡單分析一下,加深對鏈接器、嵌入式系統可執行映像特點的了解。、

        本文引用地址:http://www.104case.com/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文

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 三门县| 屏东市| 阿拉尔市| 腾冲县| 筠连县| 屯留县| 康马县| 黄浦区| 安多县| 关岭| 凤台县| 揭西县| 台东县| 罗城| 将乐县| 郧西县| 和林格尔县| 龙海市| 澳门| 长阳| 交口县| 河曲县| 灯塔市| 万全县| 密山市| 密云县| 中卫市| 阿坝县| 云霄县| 阿图什市| 隆子县| 福州市| 横山县| 安达市| 措美县| 达日县| 孝义市| 壶关县| 东乌珠穆沁旗| 新竹县| 昌平区|