uboot鏈結指令碼

2021-06-05 07:15:31 字數 2263 閱讀 4342

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 決定哪些內容放在本段,可...