鏈接腳本的描述都是以節(section)的單位的,網上也有不少描述連接腳本語法的好文章,再不濟還有官方的說明文檔能夠用來學習,其實主要就是對編譯構建的整個過程有了深刻的理解後就能對連接腳本的理解更加容易了,我這裏只是簡單的記錄一下連接腳本最基礎核心的內容。連接腳本描述一個輸出節的方式以下:學習
SECTION> [ADDRESS] [(TYPE)] : [AT(LMA)] { OUTPUT-SECTION-COMMAND OUTPUT-SECTION-COMMAND ... } [>REGION] [AT>LMA_REGION] [:PHDR :PHDR...] [=FILLEXP]
其中:
SECTION 爲輸出段的名字定義
[ADDRESS] 爲輸出段的VMA 虛擬地址
[(TYPE)] 爲輸出段的類型
[AT(LMA)] 爲輸出段的LMA 加載地址
[>REGION] 爲輸出段的VMA 地址依次累加
[AT>LMA_REGION] 爲輸出段的LMA 地址依次累加
[:PHDR :PHDR...],[=FILLEXP] 不多用
OUTPUT-SECTION-COMMAND 爲輸入段的模式匹配,定義那輸入些段會被放到這個輸出段中,須要注意的是spa
[ADDRESS] 和 [AT(LMA)]必須指定具體的地址。[><region>] 和 [AT>LMA region]只需指定MEMORY定義的內存空間,具體地址緊接着上一個output section的末尾地址。操作系統
主要是用來描述ROM和RAM的地址分佈(Memory Map)。定義的方式以下:code
MEMORY { name [attr] : ORIGIN = origin, LENGTH = len ... }
其中
<name> 是所要定義的內存區域的名字,
<origin> 是其起始地址,
<len> 爲內存區域的大小。
<attr> 屬性描述如rx,rw等是可選的blog
VMA(虛擬地址)是指程序自己運行過程的地址空間,是指令中使用的地址。好比一條絕對跳轉指令使用的地址就是虛擬地址。因此虛擬地址有時候也會被稱爲運行地址(連接地址)。之因此稱之爲虛擬地址由於在有MMU的平臺上程序運行使用的都是虛擬地址因此虛擬地址==運行地址(連接地址)。LMA(加載地址)是程序在執行前的加載過程使用的地址也能夠理解爲存儲地址即一個程序應該將程序存儲在哪裏的描述,這個地址通常由操做系統或引導代碼使用。而大多數狀況下加載地址是和虛擬地址相同的。由於一個可執行文件做爲一個總體被放在內存中開始運行大多數狀況下是不須要對可執行文件從新進行移動了。內存
以上都是我本身如今對連接腳本中的地址的含義的理解若是有不對的麻煩指出,共同進步。文檔