u-boot.lds分析

来源:互联网 发布:应用大数据的例子 编辑:程序博客网 时间:2024/05/09 07:14

u-boot.lds代码如下:

     简要说明该文件作用,该文件是链接脚本文件,在编译uboot时指定uboot可执行镜像文件链接方式,指定个段的装载地址与执行地址

/*

/*指定输出文件格式elf,32位mips指令,大端*/

OUTPUT_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips")
*/
OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
OUTPUT_ARCH(mips)/*指定输出文件的平台体系mips*/
ENTRY(_start)/*可执行镜像文件的起始段名_start,也称之为入口点*/
SECTIONS  /*连接器脚本命令*/

{

/*这个.特殊 符号是位置计数器*/

    . = 0x00000000;/*指定起始地址*/

    . = ALIGN(4);/*4字节对齐*/
    .text       : /*输出代码段*/
    {
      *(.text)/*表示所有的输入代码段*/
    }

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

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

    . = ALIGN(4);
    .sdata  : { *(.sdata) }/*未初始化可读写数据段*/

    _gp = ALIGN(16);

    __got_start = .;
    .got  : { *(.got) }/*指定got段*/
    __got_end = .;

    .sdata  : { *(.sdata) }

    . = .;

    __u_boot_cmd_start = .;   

/*u-boot命令段*/

    .u_boot_cmd : { *(.u_boot_cmd) }

    __u_boot_cmd_end = .;

    uboot_end_data = .;
    num_got_entries = (__got_end - __got_start) >> 2;

    . = ALIGN(4);
    .sbss  : { *(.sbss) }/*未初始化的bss*/
    .bss  : { *(.bss) } /*BSS段*/
    uboot_end = .;

}



当我们编译u-boot时会看到如下内容:


这个-DTEXT_BASE宏指定代码段的起始基地址为0x9fc00000

当u-boot编译成功后我们可以在u-boot.map


我们看到_start的起始地址就是虚地址0x9fc00000

当设备断电重启首先执行的就是_start在0x9fc00000地址

那么TEXT_BASE在那里指定,我们在config.mk中发现有如下代码:

# ROM version
TEXT_BASE = 0x9fc00000

# RAM version
#TEXT_BASE = 0x80100000

编译时用TEXT_BASE赋给.text,这样就指定了执行代码段的起始基地址。


0 0
原创粉丝点击