嵌入式軟件開發(fā)之:編譯器的缺省行為
13.2.4 鏈接程序放置規(guī)則
鏈接程序遵守一組規(guī)則,以決定代碼和數(shù)據(jù)位于存儲器中的什么位置,如圖13.4所示。
鏈接程序放置遵循以下規(guī)則:
① 映像首先按屬性組織:RO段在最低的存儲器地址,其次是RW段,然后是ZI段。每一種屬性中,代碼在數(shù)據(jù)之前。
② 鏈接程序按名稱的字母順序放置輸入段(Section)。輸入段名稱即匯編程序AREA偽操作定義的名稱。
圖13.4 鏈接程序放置規(guī)則
③ 在輸入段中,獨立對象的代碼和數(shù)據(jù),按照對象文件在鏈接程序命令行中被指定的順序放置。
要精確放置代碼和數(shù)據(jù),ARM公司建議不要過分依靠這些規(guī)則。相反,必須使用分散加載機制來完全控制代碼和數(shù)據(jù)的放置。請參閱下一章的調(diào)整映像存儲器映射以適應(yīng)目標系統(tǒng)硬件存儲器的實際要求。
13.2.5 應(yīng)用程序啟動
多數(shù)嵌入式系統(tǒng)中,執(zhí)行主任務(wù)前,執(zhí)行初始化序列來設(shè)置系統(tǒng)。默認的RVCT初始化序列如圖13.5所示。
圖13.5 默認RVCT初始化序列
在進入用戶代碼(main())前,初始化序列可分成三個功能塊:__main直接跳轉(zhuǎn)到__scatterload;__scatterload負責建立運行時的映像存儲器映射,而__rt_entry(運行時的入口)則負責初始化C庫。
__scatterload執(zhí)行代碼和數(shù)據(jù)復制以及ZI數(shù)據(jù)的清零。對于ZI數(shù)據(jù)的清零和未改變的RW數(shù)據(jù)來說,這一步總是要做的。
__scatterload跳轉(zhuǎn)到__rt_entry。它設(shè)置應(yīng)用程序的棧和堆,初始化庫函數(shù)及其靜態(tài)數(shù)據(jù),并調(diào)用任何全局聲明的對象的構(gòu)造函數(shù)(僅C++)。
然后__rt_entry跳轉(zhuǎn)到應(yīng)用程序入口main()。主應(yīng)用程序結(jié)束執(zhí)行時,__rt_entry將庫關(guān)閉,然后把控制權(quán)交還給調(diào)試器。
RVCT中,函數(shù)main()有一個特殊含意。main()函數(shù)的存在強制鏈接程序鏈接到__main和__rt_entry中的初始化代碼。沒有main()函數(shù),就不會鏈接到初始化進程,那么一些標準C庫功能就不會得到支持。
評論