ARM鏈結器(一) 鏈結的一般概念

2021-05-01 08:02:37 字數 2232 閱讀 4768

arm鏈結器可以把編譯(或彙編)生成的多個目標檔案和所需要的多個庫檔案鏈結在一起,生成可執行的

elf格式的輸出檔案。

在鏈結過程中,如果在鏈結器的輸入檔案中同時包含arm

**和thumb

**,鏈結器可以自動為實現不同**之間的鏈結生成乙個

veneer

檔案。該檔案用來幫助目標處理器實現兩種不同狀態之間的轉換,並可以實現長跳轉。鏈結器還可以為指令**段和或資料段指定在目標儲存器中的位置。

1、目標檔案和映像檔案

鏈結器的輸入就是編譯器的輸出。編譯器編譯後生成的檔案稱為目標檔案,是elf(executable linkable format)

格式。elf

目標檔案經過鏈結器鏈結生成的檔案稱為映像檔案,仍然是elf

格式。之所以稱為映像檔案,是因為檔案中程式之間的位置關係與實際儲存時的位址關係是對應的,程式**是實際儲存後的**的乙個「映像

」。一般情況下,儲存到程式儲存區的程式都是從位址

0x0000

開始的,但映像檔案的開始位址可以不是從

0x0000

開始,在

ads系統總預設是

0x8000。

目標檔案和映像檔案都是elf

2、檔案和段

檔案是計算機操作的基本單位,而段則是鏈結器操作的基本單位。乙個檔案中可以包含乙個或多個段。對於鏈結器來說,它不關心有多少個輸入檔案,而只關心有多少個輸入段。

鏈結器的輸入段其**可以有兩種:一種是來自原始檔中的段;另一種是來自庫中的段。這些段有三種屬性:唯讀(ro)

段、可讀寫

(rw)

段、初始化為零

(pi)段。

鏈結器的輸出是乙個可執行的映像檔案,包含乙個或多個段。這些在映象檔案中的段叫輸出段,也有三種屬性:唯讀(ro)

段、可讀寫

(rw)

段、初始化為零

(pi)段。

3、映像檔案的結構

(1)映像檔案由乙個或多個域組成

映像檔案中的域,就是存放映像檔案的乙個儲存區。乙個映像檔案占用幾個儲存區,主要看映像檔案的結構和目標儲存器的組成。如果映像檔案不大,一般情況下自用乙個儲存區;如果系統比較複雜,而檔案又很大,一般把唯讀屬性的**和可讀/

寫屬性的資料分開儲存。

(2)每個域包含乙個或多個輸出段

每個域可以包含乙個、兩個或三個輸出段,主要看域的存放位置和對輸出段的要求,也和儲存器的特性有關。

(3)每個輸出段包含乙個或多個輸入段

鏈結器把屬性相同的輸入段按照一定的順序組織在一起,形成輸出段。屬性相同的輸入段,它們在系統中的作用相近,這樣組成的輸出段便於儲存和管理。

(4)每個輸入段都都可以包含**和資料

輸入段可以包含**和資料,如在乙個**段後面定義乙個資料緩衝區。但是這樣的**和資料只能有相同的屬性,一般定義為唯讀屬性。所以,如果資料需要可讀/

寫,就不能和**處於同一段內。

1、載入域和執行域

儲存區移到高速緩衝區之後再執行,此時,載入位址就不再是執行位址了。

2、位置無關

3、映像檔案的入口點

映像檔案有兩種入口點:初始入口點和普通入口點。

l 映像檔案的初始入口點儲存在elf

格式的檔案頭中。每個映像檔案只能有乙個初始入口點。它必須滿足兩個基本條件:必須總是位於映像檔案的可執行位址範圍內;這個位址範圍不能被覆蓋,且載入位址和執行位址總是同乙個位址。初始入口點可以是普通入口點。

l 在組合語言源程式中,由entry

偽指令定義的入口點是普通入口點,並可以定義多個入口點。這些入口點可以作為中斷處理程式的入口。

1、為輸入段指定位址的方法

l 在命令列和圖形方式中使用和位址有關的選項,常用的可以影響位址分配的選項有:

-ro-base、

-rw-base

、-split

、-ropi

、-rwpi。

l 在命令列和圖形方式中使用為輸入段指定位置的選項,包括:

-entry location、

-first section-id

、-last section-id。

l 當目標系統和映像檔案很複雜時,使用scatter

格式檔案,可以為每個輸入段指定詳細位址資訊。

2、輸入檔案的排序規則

在預設情況下,鏈結器按照下面的順序組織輸入段:

l 唯讀**段

l 唯讀資料段

l 可讀寫**段

l 非零初始化的資料段

l 零初始化的資料段

廣義表一般概念

廣義表也是一種特殊的線性表,與線性表相比表中的資料元素可以是具體資料也可以是列表。記住 ls a1,a2,an 廣義表中ai為具體資料被稱為原子,廣義表中ai為列表被稱為子表。若作為廣義表中子表是該廣義表本身,可稱廣義表是遞迴的,此廣義表實際上是無限的列表。若廣義表非空,表中的第乙個元素 a1 為表...

第4章 一般概念

一 命名空間std 1.namespace具有可擴充套件開放性,可發生於任何原始碼檔案上。2.欲使用c 標準庫的任何東西,有三種選擇 1 直接指定識別符號。如std cout 2 使用using declaration。如 using std cout 3 使用using directive。如us...

一般使用動態鏈結庫DLL中類的方法

現在假設你的建立的dll名是win32dll 1.新建乙個工程。將上述的三個檔案 win32dll.lib,win32dll.dll,win32dll.h,拷貝到當前工程目錄中。在工程的標頭檔案中,引入上述標頭檔案和lib庫。include win32dll.h pragma comment lib...