uboot.lds 链接文件分析
lds文件與scatter文件相似都是決定一個可執行程序的各個段的存儲位置,以及入口地址,這也是鏈接定位的作用。
U-boot的lds文件說明如下:
secname和contents是必須的,前者用來命名這個段,后者用來確定代碼中的什么部分放在這個段,以下是這個描述中的一些關鍵字的解釋。
1、secname :段名
2、contents :決定哪些內容放在本段,可以是整個目標文件,也可以是目標文件中的某段(代碼段,數據段等)
3、start:是段的重定位地址,本段連接(運行)的地址, 如果代碼中有位置無關指令,程序運行時這個段必須放在這個地址上,start可以用任意一種描述地址的符號來描述。
例如:
/*nand.lds*/ SECTIONS {first 0x00000000:{head.o init.o}second 0x30000000:AT(4096) {main.o} }以上,head.o放在0x00000000地址開始處,init.o放在head.o后面他的運行地址也是0x00000000,即連接地址和存儲地址相同 (沒有AT指定);
main.o放在4096(0x1000是AT指定的存儲地址)開始處,但他的運行地址在0x30000000,運行之前需要從0x1000(加載地址)復制到0x30000000(運行地址處),此過程也就需要讀取flash,把程序拷貝到相應位置才能運行。這就是存儲地址和運行的不同,稱為加載時域和運行時域可以在.lds連接腳本文件中分別制定。
編寫好的.lds文件,在用arm-linux-ld連接命令時帶-Tfilename來調用執行,如
arm-linux-ld -Tnand.lds x.o y.o -o xy.o
也可用-Ttext參數直接指定連接地址如:
arm-linux-ld -Ttext 0x30000000 x.o y.o -o xy.o
既然程序有了 兩種地址,就涉及到一些跳轉指令的區別。
b step: b跳轉指令是相對跳轉,依賴當前PC的值,偏移量是通過該指令本身的bit[23:0]算出來的,這使得使用b指令的不依賴于要跳到的代碼的位置,只看指令本身。
ldr pc,=step;該指令是一個偽指令編譯后會生成以下代碼:
是從內存中的某個位置(step)讀出數據并賦給PC,同樣依賴于當前PC的值,但是偏移量是step的連接地址(運行時的地址),所以可以用它實現從Flash到RAM的程序跳轉。
/adr偽指令,匯編器會自動通過當前PC的值得算出這條指令中“_start" 的值,執行到start時PC的值放到r0中:
當此段在flash中執行時 r0=_start=0;當此段在RAM中執行時_start=_TEXT_BASE(在board/smdk2410/config.mk)中指定的值為0x33F80000,即U-Boot在把代碼拷貝到RAM中去執行的代碼段的開始/
iMX6U Uboot.lds 分析
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")指定輸出可執行文件elf格式,32位ARM指令,小端模式 OUTPUT_ARCH(arm) 指定輸入平臺為ARM ENTRY(_start) 指定輸出可執行文件的起始代碼為_start _start 在文件arch/arm/lib/vectors.S SECTIONS {. = 0x00000000; 定位當前地址為0地址. = ALIGN(4); 代碼以4字節對齊.text : 指定代碼段{*(.__image_copy_start) 指定地址為 0X87800000*(.vectors) .vectors段vectors 段保存中斷向量表,在vectors.S 中arch/arm/cpu/armv7/start.o (.text*) arch/arm/cpu/armv7/start.s 的生成文件*(.text*) 其他的代碼段}. = ALIGN(4);.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } 指定只讀數據段. = ALIGN(4);.data : {*(.data*) 指定讀寫數據段}. = ALIGN(4);. = .;. = ALIGN(4);.u_boot_list : {KEEP(*(SORT(.u_boot_list*)));}. = ALIGN(4);.image_copy_end :{*(.__image_copy_end)}.rel_dyn_start :{*(.__rel_dyn_start)}.rel.dyn : {*(.rel*)}.rel_dyn_end :{*(.__rel_dyn_end)}.end :{*(.__end)}_image_binary_end = .;. = ALIGN(4096);.mmutable : {*(.mmutable)}.bss_start __rel_dyn_start (OVERLAY) : {KEEP(*(.__bss_start));__bss_base = .;}.bss __bss_base (OVERLAY) : {*(.bss*). = ALIGN(4);__bss_limit = .;}.bss_end __bss_limit (OVERLAY) : {KEEP(*(.__bss_end));}.dynsym _image_binary_end : { *(.dynsym) }.dynbss : { *(.dynbss) }.dynstr : { *(.dynstr*) }.dynamic : { *(.dynamic*) }.plt : { *(.plt*) }.interp : { *(.interp*) }.gnu.hash : { *(.gnu.hash) }.gnu : { *(.gnu*) }.ARM.exidx : { *(.ARM.exidx*) }.gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) } }總結
以上是生活随笔為你收集整理的uboot.lds 链接文件分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql lag over_数据库sq
- 下一篇: 2012年4月语言榜