<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM基礎(chǔ)知識教程(六): ARM映像文件

          ARM基礎(chǔ)知識教程(六): ARM映像文件

          作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          1.ELF格式文件的結(jié)構(gòu)


          1.1映像文件組成部分

          本文引用地址:http://www.ex-cimer.com/article/201611/317746.htm


          **一個(gè)映像文件有一個(gè)或多個(gè)域組成
          **每個(gè)域包含一個(gè)或多個(gè)輸出段
          **每個(gè)輸出段包含一個(gè)或多個(gè)輸入段
          **各輸入段中包含了目標(biāo)文件中的代碼和數(shù)據(jù)

          輸入段中包含了四類內(nèi)容:代碼、已經(jīng)初始化的數(shù)據(jù)、未經(jīng)初始化的存儲(chǔ)區(qū)域、內(nèi)容初始化成0的存儲(chǔ)區(qū)域。每個(gè)輸入段有相應(yīng)的屬性,可以為只讀的(RO)、可讀寫的(RW)以及初始化成0的(ZI)。ARM連接器根據(jù)個(gè)輸入段的屬性將這些輸入段分組,再組成不同的輸出段及域。
          一個(gè)輸出段中包含了一系列的具有相同的RO、RW和ZI屬性的輸入段。輸出段的屬性與其中包含的輸入段的屬性相同。在一個(gè)輸出段的內(nèi)部,各輸入段是按照一定的規(guī)則排序的,這將在1.3節(jié)油詳細(xì)地介紹。
          一個(gè)域中包含1-3個(gè)輸出段,其中個(gè)輸出段的屬性各不相同。各輸出段的排列順序是由其屬性決定的。其中RO屬性的輸出段排在最前面,其次是RW屬性的輸出段,最后是ZI屬性的輸出段。一個(gè)域通常映射到一個(gè)物理存儲(chǔ)器上,如ROM或RAM。


          1.2ARM映像文件各組成部分的地址影射


          ARM映像文件各組成部分在存儲(chǔ)系統(tǒng)中的地址有兩種:一種是映像文件位于存儲(chǔ)器中時(shí)(也就是該映像文件運(yùn)行之前)的地址,稱之為加載地址;一種是映像文件運(yùn)行時(shí)的地址,稱之為運(yùn)行時(shí)地址。之所以有這兩種地址,是因?yàn)橛诚裎募谶\(yùn)行時(shí),其中的有些域是可以移動(dòng)的新的存儲(chǔ)區(qū)域。比如,已經(jīng)初始化的RW屬性的數(shù)據(jù)所在的段運(yùn)行之前可能保存系統(tǒng)的ROM中,在運(yùn)行時(shí),他被移動(dòng)至RAM中。
          通常,一個(gè)映像文件包含若干個(gè)域,各域又包含若干的輸出段。ARM連接器需要知道如下的信息,已決定如何生成相應(yīng)的映像文件。
          **分組信息 決定如何將個(gè)輸入段組織成相應(yīng)的輸出段和域。
          **定位信息 決定個(gè)域在存儲(chǔ)空間地址中的起始地址。
          根據(jù)映像文件中地址映射的復(fù)雜程度,有兩種方法來告訴arm連接器這些相關(guān)信息。對于映像文件中地址映射關(guān)系比較簡單的情況,可以使用命令行選項(xiàng);對于映像文件中地址映射關(guān)系比較復(fù)雜的情況,可以使用一個(gè)配置文件。

          2.arm映像文件的入口點(diǎn)


          2.1arm映像文件的入口點(diǎn)有兩種類型:一種是映像文件運(yùn)行時(shí)的入口點(diǎn),稱為初始入口點(diǎn)(initial entry point),另一種是普通入口點(diǎn)(entry point).
          初始入口點(diǎn)是映像文件運(yùn)行時(shí)的入口點(diǎn),每個(gè)映像文件只有一個(gè)唯一的初始入口點(diǎn),它保存在ELF頭文件中。如果映像文件是被操作系統(tǒng)加載的,操作系統(tǒng)是通過跳轉(zhuǎn)到該初始入口點(diǎn)處來加載該映像文件。
          普通的入口點(diǎn)是在匯編中用ENTRY偽操作定義。他通常用于標(biāo)志該段代碼是通過異常中斷處理程序進(jìn)入的。這樣連接器刪除無用的段時(shí)不會(huì)將該段代碼刪除。一個(gè)映像文件中可以定義多個(gè)普通入口點(diǎn)。
          應(yīng)該注意的是,初始入口點(diǎn)可以使普通入口點(diǎn),但也可以不是普通入口點(diǎn)。


          2.2定義初始入口點(diǎn)


          初始入口點(diǎn)必須滿足下面兩個(gè)條件:
          **初始入口點(diǎn)必須位于映像文件的運(yùn)行時(shí)域內(nèi)。
          **飽含初始入口點(diǎn)的運(yùn)行時(shí)域不能被覆蓋,他的加載地址和運(yùn)行地址必須是相同的。
          可以使用連接選項(xiàng)-entry address來指定映像文件的初始入口點(diǎn)。這時(shí),address指定了映像文件的初始入口點(diǎn)的地址值。
          對于地址0x0處為rom的嵌入式應(yīng)用系統(tǒng),可以使用-entry 0x0來指定映像文件的初始入口點(diǎn)。這樣當(dāng)系統(tǒng)復(fù)位后,自動(dòng)跳轉(zhuǎn)到該入口開始執(zhí)行。
          如果映像文件是被一個(gè)加載器加載的,該映像文件該映像文件必須包含一個(gè)初始化入口點(diǎn)。這種映像文件通常還包含了其他普通入口點(diǎn),這些普通入口點(diǎn)一般為異常中斷處理程序的入口地址。
          當(dāng)用戶沒有指定-entry address時(shí),連接器根據(jù)下面的規(guī)則決定映像文件的初始入口點(diǎn)。
          **如果輸入的目標(biāo)文件中只有一個(gè)普通入口點(diǎn),該普通入口點(diǎn)被連接器當(dāng)成映像文件的初始入口點(diǎn)。
          **如果輸入的目標(biāo)文件中沒有一個(gè)普通入口點(diǎn),或者其中的普通入口點(diǎn)多于一個(gè),則連接器生成的映像文件中不包含初始入口點(diǎn),并產(chǎn)生警告信息。


          2.3普通入口點(diǎn)的用法


          普通入口點(diǎn)是在匯編中用ENTRY 偽操作定義。在嵌入式應(yīng)用中,各異常中斷的處理程序入口使用普通入口點(diǎn)標(biāo)示。這樣連接器在刪除無用段時(shí)不會(huì)將該段代碼刪除。
          一個(gè)映像文件中可以定義多個(gè)普通入口點(diǎn)。沒有指定連接選項(xiàng)-entry addres時(shí),如果輸入的目標(biāo)文件中只有一個(gè)普通入口點(diǎn),該入口點(diǎn)被連接器當(dāng)成映像文件的初始入口點(diǎn)。


          3輸入段的排序規(guī)則

          連接器根據(jù)輸入段的屬性來組織這些輸入段,具有相同屬性的輸入段被放到域中一段連續(xù)的空間中,組成一個(gè)輸出段。在一個(gè)輸出段中,各輸入段的起始地址與

          輸出段的起始地址和該輸出段中個(gè)輸入段的排列順序有關(guān)。
          通常情況下,一個(gè)輸出段中個(gè)輸入段的排列順序由下面幾個(gè)因素決定的。用戶可以通過連接選項(xiàng)-first和-last來改變這些規(guī)則。
          **輸入段的屬性。
          **輸入段的名稱
          **各輸入段在連接命令行的輸入段列表中的排列順序
          按照輸入段的屬性,其排列順序如下所示:
          **只讀的代碼段
          **只讀的數(shù)據(jù)段
          **可讀寫的代碼段
          **其他已經(jīng)初始化的數(shù)據(jù)段
          **未出世化的數(shù)據(jù)
          對于具有相同屬性的輸入段,按照其名稱來排序。這是輸入段名稱是區(qū)分大小寫的,按照其ASCII碼順序進(jìn)行排序。
          對于具有相同屬性和名城的輸入段,按照其在輸入段列表中的順序進(jìn)行排序。也就是說,幾十個(gè)輸入段的屬性和名稱保持不變,如果其在編譯時(shí),各輸入段在輸

          入段列表中的排列順序不同,生成的映像文件也將不同。
          可以通過連接選項(xiàng)-first和-last來改變這些規(guī)則。如果連接時(shí)使用了配置文件,可以在配置文件中通過偽屬性FIRST和LAST達(dá)到相同的效果。
          連接選項(xiàng)-first和-last不能改變根據(jù)輸入段進(jìn)行排序的規(guī)則,它只能改變根據(jù)輸入段名稱和其在輸入列表中的順序的排序規(guī)則。也就是說,如果使用-first指定

          一個(gè)輸入段,只有該輸入段所在的輸出段位于運(yùn)行時(shí)域的開始位置時(shí),該輸入段才能位于整個(gè)運(yùn)行時(shí)域的開始位置。
          各個(gè)輸入段排好順序后,在確定各個(gè)輸入段的起始地址之前,何以通過填充補(bǔ)丁是個(gè)輸入段滿足地址對齊的要求。

          ***********************************************************

          ARM連接器介紹

          ***********************************************************

          ARM連接器armlink將編譯得到的ELF格式文件以及相關(guān)的C/C++運(yùn)行時(shí)庫連接生成相應(yīng)的結(jié)果文件。armlink可以完成下面的操作:
          **連接編譯后得到的目標(biāo)文件相應(yīng)的c/c++運(yùn)行時(shí)庫,生成可執(zhí)行的影像文件。
          **將一些目標(biāo)文件進(jìn)行連接,生成一個(gè)新的目標(biāo)文件,供將來進(jìn)一步連接時(shí)使用,這成為部分連接。
          **指定代碼和數(shù)據(jù)在內(nèi)存中的位置。
          **生成被連接文件的調(diào)試信息和相互間的引用信息。
          Armlink在進(jìn)行部分連接和完全生成可執(zhí)行文件時(shí)作進(jìn)行的操作是不同的。下面分別介紹:
          (1)解析輸入的目標(biāo)文件之間的符號引用關(guān)系。
          (2)根據(jù)輸入目標(biāo)文件對c/c++函數(shù)的調(diào)用關(guān)系,從c/c++運(yùn)行時(shí)庫中提取相應(yīng)模塊。
          (3)將各個(gè)輸入段排序,組成相應(yīng)的輸出段。
          (4)刪除重復(fù)的調(diào)試信息。
          (5)根據(jù)用戶指定的分組和定位信息,建立映像文件的地址映射關(guān)系。
          (6)重定位需要重定位的值。
          (7)生成可執(zhí)行的映像文件。
          armlink在進(jìn)行部分連接生成新的目標(biāo)文件時(shí)執(zhí)行下面的操作。
          (1)刪除重復(fù)的調(diào)試信息
          (2)最小化符號表的大小
          (3)保留那些未被解析的符號
          (4)生成新的目標(biāo)文件
          下面根據(jù)各armlink的命令行選項(xiàng)的功能分類列舉了armlink的命令行選項(xiàng),各選項(xiàng)的具體用法將在后面有詳細(xì)地介紹。
          **提供關(guān)于armlink的幫助信息
          **指定輸出文件的名稱和類型:*-output;*-partial;*-elf
          **使用選項(xiàng)文件,其中可以包含一些連接選項(xiàng)。
          **制定可執(zhí)行映像文件的內(nèi)存映射關(guān)系。*-rwpi;*-ropi;*-rw_base;*-ro_base;*-spit;*-scatter
          **控制可執(zhí)行映射文件的內(nèi)容。*-first;*-last
          **生成與映像文件的相關(guān)信息
          **控制armlink生成相關(guān)的診斷信息。



          關(guān)鍵詞: ARM基礎(chǔ)知識映像文

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();