U-boot.lds文件分析

1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
2 OUTPUT_ARCH(arm)
3 ENTRY(_start)

lds文件位於board/samsung/smdk6410/u-boot-nand.lds下。數據結構

指定elf32-littlearm 格式,即指定輸出文件是elf格式,32位ARM指令,小端模式;函數

緊接着OUTPUT_ARCH(arm) 指定的是輸出可執行文件的運行平臺爲ARM;spa

ENTRY(_start)指定_start函數爲程序的入口, _start 在arch/arm/cpu/arm1176/ start.S 中定義,真正的啓 動運行地址段在編譯時在 board/samsung/smdk6410/config.mk 中由CONFIG_SYS TEXT_BASE 宏定義,即 TEXT_BASE = 0x57E00000
1 SECTIONS
2 {
3     . = 0x00000000;
4 
5     . = ALIGN(4);

SECTIONS開始定義程序段。code

這裏的點」.」,是定位器符號(GNU風格的一個典型)。         blog

把定位器符號置爲0x00000000 (若不指定, 則該符號的初始值爲0)。         it

定系統啓動從偏移地址零處開始。注意這只是個代碼地址偏移值,真正的起始地址是由編譯時指定的io

CFLAGS指定的。 編譯

4字節對齊調整,那麼ALIGN(0x10) 即16字節對齊後。class

1 .text      :
2     {
3       arch/arm/cpu/arm1176/start.o    (.text)
4           board/samsung/smdk6410/libsmdk6410.o  (.text)
5       *(.text)
6     }

.text爲段名,這段腳本的意思是將全部輸入文件的.text section,以及arch/arm/cpu/arm1176/start.o、board/samsung/smdk6410/libsmdk6410.o合併成一個.text section,該section的地址由定位器符號的值指定(字節對齊後定位器符號的值)。程序

1 . = ALIGN(4);
2     .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }

 修改當前定位寄存器,使的下面的.rodata輸出節與4bytes對齊,定義.rodata輸出節爲全部文件的.rodata輸入節,*表示通配符,(.rodata*)爲全部rodata開頭的段。

1 .rel.dyn : {
2         __rel_dyn_start = .;
3         *(.rel*)
4         __rel_dyn_end = .;
5     }

 用於用於動態鏈接的重定位信息。

1 .dynsym : {
2         __dynsym_start = .;
3         *(.dynsym)
4     }

.dynsym動態符號表,這個表只保存了與動態連接相關的符號, __dynsym_start = . ;這是動態鏈接符號表的數據結構部分,須與.dynstr聯用。

1 .bss __rel_dyn_start (OVERLAY) : {
2         __bss_start = .;
3         *(.bss)
4         . = ALIGN(4);
5         __bss_end__ = .;
6     }

 

 bss,爲何會有__rel_dyn_start(OVERLAY),不知道緣由。 

這裏說明一點:在沒有對位置技術器進行賦值時,位置計數器會動態的增長,好比. = .;這一條語句,此時位置技術器的位置就是從0開始加上代碼段,只讀數據段,數據段,got段的大小,緊接着以後的位置。

相關文章
相關標籤/搜索