gnu編譯器生成的目標檔案預設為elf格式,elf檔案由若干段(section)組成,如不特殊指明,由c源程式生成的目標**中包含如下段:.text(正文段)包含程式的指令**;.data(資料段)包含固定的資料,如常量、字串;.bss(未初始化資料段)包含未初始化的變數、陣列等。c++源程式生成的目標**中還包括.fini(析構函式**)和.init(建構函式**)等.鏈結器的任務就是將多個目標檔案的.text、.data和.bss等段連線在一起,而連線指令碼檔案是告訴鏈結器從什麼位址開始放置這些段.簡而言之,由於乙個工程中有多個.c檔案,當它們生成.o檔案後如何安排它們在可執行檔案中的順序,這就是鏈結指令碼的作用.
(1).lds檔案的完整形式
sections
>region :phdr =fill
...}
<1>secname:段名,必須填寫.
<2>contents:決定哪些內容可以放在該段,可以是整個目標檔案,也可以是目標檔案中的某段(**段、資料段等).必須填寫.
例程1:
sections
second 0x30000000 : at(4096)
}head.o放在0x00000000位址開始處,init.o放在head.o後面,它們的執行位址是0x00000000,即連線和儲存位址相同;main.o放在4096(0x1000,是at指定的,儲存位址)開始處,但它的執行位址在0x30000000,執行之前需要從0x1000(載入處)複製到0x30000000(執行處),此過程也就用到了讀取nand flash。這就是儲存位址和連線(執行)位址的不同,稱為載入時域和執行時域,可以在.lds連線指令碼檔案中分別指定.
例程2:
entry(begin)
section
.data:
.bss:
} entry(begin)指明程式的入口點為begin標號;
.=0x00300000指明目標**的起始位址為0x00300000,這一段位址可以是sdram的起始位址;
.text : 表示從0x00300000開始放置所有目標檔案的**段,
.data: 表示資料段從**段的末尾開始,
再後是.bss段.
(3)uboot.lds檔案分析
uboot的鏈結指令碼檔案放在arch\arm\cpu\arm920t下.具體內容如下:
output_format("elf32-littlearm", "elf32-littlearm", "elf32-littlearm"")
/*指定輸出可執行檔案是elf格式、32位arm指令、小端*/
output_arch(arm) /*指定輸出可執行檔案的平台為arm*/
entry(_start) /*指定輸出可執行檔案起始**段為_start*/
sections
. = align(4)
.rodata : /*指定唯讀資料段,ro段*/
. = align(4);
.data : /*指定讀/寫資料段,rw段*/
. = align(4);
.got : /*指定got段, got段式是uboot自定義的乙個段, 非標準段*/
__u_boot_cmd_start = . /*把__u_boot_cmd_start賦值為當前位置, 即起始位置*/
.u_boot_cmd : /*指定u_boot_cmd段, uboot把所有的uboot命令放在該段*/
__u_boot_cmd_end = . /*把__u_boot_cmd_end賦值為當前位置,即結束位置*/
. = align(4);
__bss_start = . /*把__bss_start賦值為當前位置,即bss段的開始位置*/
.bss : /*指定bss段*/
_end = . /*把_end賦值為當前位置,即bss段的結束位置*/
} 通過上面的分析可以看出:
<1>由於在鏈結指令碼中規定了檔案start.o(對應於start.s)作為整個uboot的起始點,因此啟動uboot時會執行首先執行start.s
<2>一般來說,記憶體空間可分為**段、資料段、全域性變數段、未初始化變數區、棧區、堆區等.其中,棧區由指標sp決定,堆區實質上是由c**實現的,其它段則由編譯器決定.從上面的分析可以看出,從0x00000000位址開始,編譯器首先將**段放在最開始的位置,然後是資料段,然後是bss段(未初始化變數區).
文章出處:飛諾網(www.diybl.com):
u boot鏈結分析
乙個典型的嵌入式系統中,bootloader 放在nor flash或nand flash裡面,系統加電或復位後,首先執行這段 通常把bootloader 放在nor flash裡面,nand flash由於硬體原因不能隨機訪問,需要特殊的硬體支援機制。bootloader 除了初始化以外就是搬運程...
u boot鏈結分析
華清遠見嵌入式培訓中心 講師。乙個典型的嵌入式系統中,bootloader 放在nor flash或nand flash裡面,系統加電或復位後,首先執行這段 通常把bootloader 放在nor flash裡面,nand flash由於硬體原因不能隨機訪問,需要特殊的硬體支援機制。bootload...
u boot中 lds鏈結指令碼檔案的分析
對於.lds檔案,它定義了整個程式編譯之後的連線過程,決定了乙個可執行程式的各個段的儲存位置。sections region phdr fill secname和contents是必須的,其他的都是可選的。下面挑幾個常用的看看 1 secname 段名 2 contents 決定哪些內容放在本段,可...