ARM映像檔案

1.ELF格式檔案的架構

1.1映像檔案組成部分

**一個映像檔案有一個或多個域組成
**每個域包含一個或多個輸出段
**每個輸出段包含一個或多個輸入段
**各輸入段中包含了目標檔案中的代碼和數據

輸入段中包含了四類內容︰代碼、已經初始化的數據、未經初始化的存儲區域、內容初始化成0的存儲區域。每個輸入段有相應的屬性,可以為只讀的(RO)、可讀寫的(RW)以及初始化成0的(ZI)。ARM連接器根據個輸入段的屬性將這些輸入段分組,再組成不同的輸出段及域。

一個輸出段中包含了一系列的具有相同的RO、RW和ZI屬性的輸入段。輸出段的屬性與其中包含的輸入段的屬性相同。在一個輸出段的內部,各輸入段是按照一定的規則排序的,這將在1.3節油詳細地介紹。
一個域中包含1-3個輸出段,其中個輸出段的屬性各不相同。各輸出段的排列順序是由其屬性決定的。其中RO屬性的輸出段排在最前面,其次是RW屬性的輸出段,最後是ZI屬性的輸出段。一個域通常映射到一個物理存儲器上,如ROM或RAM。

1.2ARM映像檔案各組成部分的位址影射

ARM映像檔案各組成部分在存儲系統中的位址有兩種︰一種是映像檔案位於存儲器中時(也就是該映像檔案營運之前)的位址,稱之為加載位址;一種是映像檔案營運時的位址,稱之為營運時位址。之所以有這兩種位址,是因為映像檔案在營運時,其中的有些域是可以移動的新的存儲區域。比如,已經初始化的RW屬性的數據所在的段營運之前可能儲存系統的ROM中,在營運時,他被移動至RAM中。
通常,一個映像檔案包含若干個域,各域又包含若干的輸出段。ARM連接器需要知道如下的訊息,已決定如何生成相應的映像檔案。
**分組訊息 決定如何將個輸入段組織成相應的輸出段和域。
**定位訊息 決定個域在存儲空間位址中的起始位址。
根據映像檔案中位址映射的複雜程度,有兩種方法來告訴arm連接器這些相關訊息。對於映像檔案中位址映射關係比較簡單的情況,可以使用命令行選項;對於映像檔案中位址映射關係比較複雜的情況,可以使用一個配置檔案。

2.arm映像檔案的入口點

2.1arm映像檔案的入口點有兩種類型︰一種是映像檔案營運時的入口點,稱為初始入口點(initial entry point),另一種是普通入口點(entry point).
初始入口點是映像檔案營運時的入口點,每個映像檔案只有一個唯一的初始入口點,它儲存在ELF頭檔案中。如果映像檔案是被作業系統加載的,作業系統是透過跳轉到該初始入口點處來加載該映像檔案。
普通的入口點是在彙編中用ENTRY偽操作定義。他通常用於標誌該段代碼是透過異常中斷處理程式進入的。這樣連接器刪除無用的段時不會將該段代碼刪除。一個映像檔案中可以定義多個普通入口點。
應該注意的是,初始入口點可以使普通入口點,但也可以不是普通入口點。

2.2定義初始入口點

初始入口點必須滿足下面兩個條件︰
**初始入口點必須位於映像檔案的營運時域內。
**飽含初始入口點的營運時域不能被覆蓋,他的加載位址和營運位址必須是相同的。
可以使用連接選項-entry address來指定映像檔案的初始入口點。這時,address指定了映像檔案的初始入口點的位址值。
對於位址0x0處為rom的嵌入式應用系統,可以使用-entry 0x0來指定映像檔案的初始入口點。這樣當系統複位後,自動跳轉到該入口開始執行。
如果映像檔案是被一個加載器加載的,該映像檔案該映像檔案必須包含一個初始化入口點。這種映像檔案通常還包含了其他普通入口點,這些普通入口點一般為異常中斷處理程式的入口位址。
當用戶沒有指定-entry address時,連接器根據下面的規則決定映像檔案的初始入口點。
**如果輸入的目標檔案中只有一個普通入口點,該普通入口點被連接器當成映像檔案的初始入口點。
**如果輸入的目標檔案中沒有一個普通入口點,或者其中的普通入口點多於一個,則連接器生成的映像檔案中不包含初始入口點,並產生警告訊息。

2.3普通入口點的用法

普通入口點是在彙編中用ENTRY 偽操作定義。在嵌入式應用中,各異常中斷的處理程式入口使用普通入口點標示。這樣連接器在刪除無用段時不會將該段代碼刪除。
一個映像檔案中可以定義多個普通入口點。沒有指定連接選項-entry addres時,如果輸入的目標檔案中只有一個普通入口點,該入口點被連接器當成映像檔案的初始入口點。

3輸入段的排序規則

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

輸出段的起始位址和該輸出段中個輸入段的排列順序有關。
通常情況下,一個輸出段中個輸入段的排列順序由下面幾個原素決定的。用戶可以透過連接選項-first和-last來改變這些規則。
**輸入段的屬性。
**輸入段的名稱
**各輸入段在連接命令行的輸入段清單中的排列順序
按照輸入段的屬性,其排列順序如下所示︰
**只讀的代碼段
**只讀的數據段
**可讀寫的代碼段
**其他已經初始化的數據段
**未出世化的數據
對於具有相同屬性的輸入段,按照其名稱來排序。這是輸入段名稱是區分大小寫的,按照其ASCII碼順序進行排序。
對於具有相同屬性和名城的輸入段,按照其在輸入段清單中的順序進行排序。也就是說,幾十個輸入段的屬性和名稱保持不變,如果其在編譯時,各輸入段在輸

入段清單中的排列順序不同,生成的映像檔案也將不同。
可以透過連接選項-first和-last來改變這些規則。如果連接時使用了配置檔案,可以在配置檔案中透過偽屬性FIRST和LAST達到相同的效果。
連接選項-first和-last不能改變根據輸入段進行排序的規則,它只能改變根據輸入段名稱和其在輸入清單中的順序的排序規則。也就是說,如果使用-first指定

一個輸入段,只有該輸入段所在的輸出段位於營運時域的開始位置時,該輸入段才能位於整個營運時域的開始位置。
各個輸入段排好順序後,在確定各個輸入段的起始位址之前,何以透過填充補丁是個輸入段滿足位址對齊的要求。

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

ARM連接器介紹

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

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

立你斯 發表在 痞客邦 留言(0) 人氣()