參考:《程式設計師的自我修養:鏈結、裝載與庫》
什麼是鏈結指令碼?鏈結指令碼就是程式鏈結時的參考檔案,其主要目的是描述如何把輸入檔案中的段(section)對映到輸出檔案中,並控制輸出檔案的儲存布局。鏈結指令碼的基本命令式sections命令,乙個sections命令內部包含乙個或多個段,段(section)是鏈結指令碼的基本單元,它表示輸入檔案中的某個段是如何放置的。
sections
下面我們配合link.lds進行具體講解:
sections
.data :
bss_start = .;
.bss :
bss_end = .;
}link.lds中的.text 、 .data 、 .bss分別是text段、data段、bss段的段名(這些段名並不是固定的,是可以隨便起的)。.text段包含的內容是start.o和其餘**中所有的text段;.data段包含的內容是**中所有的data段;.bss段包含的內容是**中所有的bss段。
bss_start和bss_end儲存的是bss段的起始位址和結束位址,在start.s中會被用到。
下面解釋一下什麼是data、text、bss段:
1) data段:資料段(datasegment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。
2) text段:**段通常是指用來存放程式執行**的一塊記憶體區域。這部分區域的大小在程式執行前就已經確定,並且記憶體區域通常屬於唯讀,某些架構也允許**段為可寫,即允許修改程式。在**段中,也有可能包含一些唯讀的常數變數,例如字串常量等。
3) bss段:指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。當我們的程式有全域性變數是,它是放在bss段的,由於全域性變數預設初始值都是0,所有我們需要手動清bss段。
1指令碼構成
1.1鏈結器指令碼基本構成-段
乙個可執行程式通常是由:**段,資料段,bss段構成的。同樣,在用於鏈結這個程式的鏈結器指令碼中,就會反應出這幾個段的資訊。
建立鏈結器指令碼-段資訊
1.2設定起始鏈結位址
( . = 0x0; "."表示當前位置)
注:位址變化的影響在後續講解。
1.3對齊設定
分別對當前位址、.text段、.data段和.bss段位址4位元組對齊
1.4使用變數
bss_start = . ; 記錄bss段首當前位址,儲存下來
bss_end = . ; 記錄bss段尾當前位址,儲存下來
這些位址儲存下來,可以在程式中使用
1.5設定**段首檔案
哪個**段排在**的最前面呢?
指明start.o排在最前面,執行程式首先執行start.o,主要是cpu上電要完成初始化;
鏈結器指令碼
鏈結器指令碼構成 段 起始鏈結位址 對齊 變數 段首檔案 乙個可執行程式通常由 段,資料段,bss段構成。其中資料段存放的是初始化後的前期變數 bss段存放的是沒有初始化的前期變數 乙個鏈結器指令碼led.lds例子 output arch arm 指定輸出檔案的平台體系是arm entry sta...
1 1 4 鏈結器指令碼
1.程式由 段 sections 和堆疊 stack 組成,而段 sections 包括四個部分,分別為 段 text 資料段 data 以及bss段 bss 1.1 段 text 存放要執行的程式指令 1.2 資料段 data 存放已初始化的全域性變數 1.3 bss段 bss 存放未初始化的全域...
Linker script 鏈結器指令碼(1)
每個鏈結都由鏈結指令碼控制著,指令碼由鏈結器命令語言組成。指令碼的主要目的是描述如何把輸入檔案中的節 sections 對映到輸出檔案中,並控制輸出檔案的儲存布局。大多數的鏈結指令碼就是做這些事情的,但在有必要時,指令碼也可以指導鏈結器執行一些其他的操作。鏈結器總是使用鏈結器指令碼,如果你沒有提供乙...