uboot链接文件uboot.lds解析

uboot.lds文件放在 board/samsung/x210 目录下。

解析如下:

/* 指定输出文件格式:32位efl格式、arm指令、小端格式 */
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

/* 指定输出文件平台:arm */
OUTPUT_ARCH(arm)														

/* 指定输出文件的入口地址:_start */
ENTRY(_start)															

SECTIONS
{
    . = 0x00000000;                           /* 定位当前地址:0x0 */

    . = ALIGN(4);                             /* 代码以4字节对齐 */
    .text :                                   /* 指定代码段:必须将start.o文件放在代码段起始位置,其他文件可任意放 */
    {
        cpu/s5pc11x/start.o (.text)           /* 代码段第1部分,指定start.o是入口程序,放在代码段开头 */
        cpu/s5pc11x/s5pc110/cpu_init.o (.text)
        board/samsung/x210/lowlevel_init.o (.text)
        cpu/s5pc11x/onenand_cp.o (.text)                 
        cpu/s5pc11x/nand_cp.o (.text)                     
        cpu/s5pc11x/movi.o (.text) 
        common/secure_boot.o (.text) 
        common/ace_sha1.o (.text)
        cpu/s5pc11x/pmic.o (.text)
        *(.text)
    }

    . = ALIGN(4);
    .rodata : { *(.rodata) }                     /* 指定只读数据段: RO段 */

    . = ALIGN(4);
    .data : { *(.data) }                         /* 指定读写数据段:RW段 */

    . = 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把所有的命令放在该段 */
    __u_boot_cmd_end = .;                        /* __u_boot_cmd_end赋值为当前位置,即结束位置 */

    . = ALIGN(4);
    .mmudata : { *(.mmudata) }

    . = ALIGN(4);
    __bss_start = .;                             /* 把__bss_start赋值为当前位置,即bss段的开始位置 */
    .bss : { *(.bss) }                           /* 指定bss段 */
    _end = .;                                    /* 把__bss_end赋值为当前位置,即bss段的结束位置 */
}

/* 由于在链接脚本中规定了文件start.o(对应于start.S)作为整个uboot的起始点, 因此启动uboot时 */
/* 会首先执行start.S。*/

/* 一般来说,内存空间可分为代码段、数据段、全局变量段、未初始化变量区、栈区、堆区等.其中,栈 */
/* 区由指针SP决定,堆区实质上是由C代码实现的,其它段则由编译器决定.从上面的分析可以看出,从 */
/* 0x00000000地址开始,编译器首先将代码段放在最开始的位置,然后是数据段,然后是bss段(未初始 */
/* 化变量区)。 */

注意:可以观察一下代码段中文件的排列顺序。指定必须放在前面部分的那些文件就是那些必须安排在前 16KB 内的文件,这些文件中的函数在前 16KB 会被调用,在后面的第二部分(16KB之后)中调用的程序,前后顺序就无所谓了。

猜你喜欢

转载自blog.csdn.net/linuxweiyh/article/details/82380381
今日推荐