1. 程式人生 > >Uboot啟動流程(一)——u-boot.lds

Uboot啟動流程(一)——u-boot.lds

.lds為連結指令碼
我們平時寫的程式碼也會有連結(ld)過程;x86下面輸入ld -verbose可以檢視連結指令碼
uboot生成映象也是需要lds的,下面為lds部分內容:

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
    . = 0x00000000;

    . = ALIGN(4);
    .text   :
    {
        __text_start = .;
        arch/arm/cpu/hi3559/start.o
(.text) drivers/ddr/ddr_training_impl.o (.text) drivers/ddr/ddr_training_ctl.o (.text) drivers/ddr/ddr_training_boot.o (.text) drivers/ddr/ddr_training_custom.o (.text) __init_end = .; ASSERT(((__init_end - __text_start) < 0x16000), "init sections too big!"); *(.text
) } . = ALIGN(4); .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .got : { *(.got) } __u_boot_cmd_start = .; .u_boot_cmd : { *(.u_boot_cmd) } __u_boot_cmd_end = .; . = ALIGN(4); __bss_start = .;
.bss : { *(.bss) } _end = .; }

幾個你需要知道的知識點:
1、elf32-littlearm:elf格式 32位arm指令,小端(反正先這麼記著,對我來說也沒有用)
2、ENTRY(_start)入口為_start;
3、接下來是data段 text段之類的
4、注意這裡的0x00000000並不是說_stat起始在0x0處,實際檢視System.map可以看到一般都不是0.比如我這裡是0x88400000,還有一個uboot是0x8d400000.這個數字是由/board/hiXXXX/config.mk裡面的TEXT_BASE指定的;