1. 程式人生 > >u-boot.lds分析

u-boot.lds分析

系統 代碼 tex 裏的 完成 參數 output ima style

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*指定輸出的格式是32bits ARM 小端*/
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")指定輸出的格式是32bits ARM 小端。
OUTPUT_FORMAT原型為 OUTPUT_FORMAT(default, big, little),在鏈接的時候,如果使用了-EB的命令行參數,則使用這裏的big參數指定的字節序,
如果使用了-EL的命令行參數,則使用這裏的little參數指定的字節序,如果沒有使用任何命令行參數,則使用這裏的default參數指定的字節序。

由uboot.lds中的定義可見,不管在鏈接的時候使用了何種命令行參數,輸出的目標文件都是使用elf32-littlearm方式的字節序。
* OUTPUT_ARCH(arm)/*指出輸出可執行文件的平臺是arm*/ ENTRY(_start)/*指定輸出可執行文件的起始代碼段是_start,_start在cpu/arm920t/Start.S,
正的啟動運行地址段在編譯時在u-boot-1.1.6\board\100ask24x0\config.mk中由CONFIG_SYSTEXT_BASE宏定義,即TEXT_BASE = 0x33F80000
查看Makefile中的LDFLAGS變量,發現一條指令LDFLAGS += -Ttext $(TEXT_BASE)

其中TEXT_BASE 是在u-boot根目錄的board文件夾的對應的開發板名字的子目錄下的config.mk文件中定義的0x33F80000*/
SECTIONS {
/*指定可執行image文件的全局入口點,通常這個地址都放在ROM(flash)0x0位置。必須使編譯器知道這個地址,通常都是修改此處來完成*/ .
= 0x00000000;/*這裏的點”.”,是定位器符號(GNU風格的一個典型),把定位器符號置為0x00000000 (若不指定, 則該符號的初始值為0)。
指定系統啟動從偏移地址零處開始。註意這只是個代碼地址偏移值,真正的起始地址是由編譯時指定的LDFLAGS指定的。實際中改動這個值對輸出沒有影響
*/ . = ALIGN(4);/*調整定位符號,使其4字節對齊*/ .text :/*.text為段名,這段腳本的意思是將所有輸入文件的.text section,
以及cpu/arm920t/start.o、 board/100ask24x0/boot_init.o 合並成一個.text section,該section的地址由定位器符號的值指定
*/
{ cpu
/arm920t/start.o (.text) board/100ask24x0/boot_init.o (.text) *(.text) } . = ALIGN(4);/*修改當前定位寄存器,使的下面的.rodata輸出節與4bytes對齊,定義.rodata輸出節為所有文件的.rodata輸入節,*表示通配符,(.rodata*)為所有rodata開頭的段。*/ .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .got : { *(.got) }/*指定got段, got段是uboot自定義的一個段, 非標準段*/ . = .; __u_boot_cmd_start = .;/*把__u_boot_cmd_start賦值為當前位置, 即起始位置*/ .u_boot_cmd : { *(.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段的結束位置*/ }

u-boot.lds分析