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
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段的大小,緊接着以後的位置。