靜態程序編譯鏈接與加載(五)鏈接腳本大作戰

在程序編譯的過程中,鏈接腳本起了非常大的作用,對各個.o文件,如何組合,VMA與LMA如何定義,都由這個文件來決定。

下面,針對鏈接腳本,進行一系列的實驗。

一、最簡單鏈接腳本,代碼段和數據段,合成一個segment

鏈接腳本如下圖所示:


數據段,緊跟代碼段

代碼段和數據,最終合成一個segment

全部的section,都合併到一個segment中了。segment的屬性是RWE。


二、代碼段和數據段分開,生成2個segment

鏈接腳本如下:


一般代碼段和數據段,是會放在不同的位置的。

在鏈接腳本中,分別定義代碼段和數據的起始地址


三、使用AT定義加載地址

鏈接腳本如下所示:


一般來說,加載地址和鏈接地址是一樣的。但是可以在鏈接腳本中,使用AT關鍵字,來指定鏈接地址。

boot段,映射到了segment0, va爲0x50000000, pa爲0

text1段和text2段,映射到了segment1,va爲0x60000000, pa爲0x400

data段和data1段,映射到了segment2,va爲0x80000000,pa爲0x1000


四、使用MEMORY關鍵字,定義memory空間

在鏈接腳本中,可以使用MEMORY關鍵字,定義memory空間,格式如下圖:


  • 使用MEMORY,可以定義memory空間。  

  • NAME是memory的名字

  • ATTR,是memory的屬性,  RWX

  • ORIGIN: VA地址

  • LENGTH: memory大小

以下鏈接腳本:


ELF的segment信息如下圖:


boot段,映射到了segment0, va爲0x10000000, pa爲0

text1段和text2段,映射到了segment1,va爲0x20000000, pa爲0x400

data段和data1段,映射到了segment2,va爲0x5000000,pa爲0x1000

可見,在鏈接腳本中 .= 賦值,是沒有作用的。

轉載地址 http://www.lujun.org.cn/?p=4230
也歡迎訪問我的個人網站 http://www.lujun.org.cn

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