鏈接的一般概念

ARM鏈接器可以把編譯(或彙編)生成的多個目標文件和所需要的多個庫文件鏈接在一起,生成可執行的ELF格式的輸出文件。

在鏈接過程中,如果在鏈接器的輸入文件中同時包含ARM代碼和Thumb代碼,鏈接器可以自動爲實現不同代碼之間的鏈接生成一個veneer文件。該文件用來幫助目標處理器實現兩種不同狀態之間的轉換,並可以實現長跳轉。鏈接器還可以爲指令代碼段和或數據段指定在目標存儲器中的位置。

1  鏈接的一般概念
1.1  鏈接器的輸入和輸出
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  映像文件的加載和執行
1、加載域和執行域

映像文件可以有兩種地址:加載地址和執行地址。加載地址就是文件在存儲器中的存儲地址,執行地址就是文件在運行時的地址。文件加載的存儲區叫加載域,文件運行的存儲區叫執行域。例如,爲了提高速度,要把執行的程序從ROM存儲區移到高速緩衝區之後再執行,此時,加載地址就不再是執行地址了。

2、位置無關

3、映像文件的入口點

映像文件有兩種入口點:初始入口點和普通入口點。

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

l 在彙編語言源程序中,由ENTRY僞指令定義的入口點是普通入口點,並可以定義多個入口點。這些入口點可以作爲中斷處理程序的入口。

1.3  輸入段在映像文件中的排列順序
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 零初始化的數據段

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/formerman/archive/2009/07/26/4382034.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章