在程序編譯的過程中,鏈接腳本起了非常大的作用,對各個.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