您的位置:首页 > 其它

u-boot链接脚本

2013-07-31 13:48 176 查看
arm-limux-gcc将所有的.c文件编译成.o文件后,需要将它们组织成一个可执行文件。怎么组织,这就是u-boot.lds的事了!它一般存放在/board/xxxx/

下面贴出TQ2440中所用的u-boot-1.1.6中所用的链接文件u-boot.lds

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")//可执行文件的格式
OUTPUT_ARCH(arm)           //可执行文件的建构
(_start)                   //可执行文件的第一条可执行指令的地址,该标号在u-boot的/cpu/arm920t/start.S中定义
SECTIONS
{
. = 0x00000000;    //.是一个特殊的符号,它是定位器,一个位置指针,现在程序的程序的虚拟地址(VMA)指向0x00000000
. = ALIGN(4);      //调整.定位器的值,使它能够4字节对齐
.text      :       //紧接着就存放程序的.text段
{
cpu/arm920t/start.o(.text)
board/EmbedSky/boot_init.o(.text)
board/EmbedSky/lowlevel_init.o (.text)
*(.text)  //将start.o,boot_init.o,lowevel_init.o的代码段存放在程序的开始,然后紧接着就保存所有其他.o文件的代码段
}
. = ALIGN(4);           //调整.定位器的值,使它能够4字节对齐
.rodata : { *(.rodata) }//紧接着存放所有.o文件的只读数据段

. = ALIGN(4);           //调整.定位器的值,使它能够4字节对齐
.data : { *(.data) }    //紧接着存放所有.o文件的初始化的全局变量和初始化的静态变量

. = ALIGN(4);           //调整.定位器的值,使它能够4字节对齐
.got : { *(.got) }      //紧接着存放所有.o文件的初始化的got段

. = .;
__u_boot_cmd_start = .;         //外部变量 __u_boot_cmd_start的值为当前定位器的值,u-boot源码中会使用该变量
.u_boot_cmd : { *(.u_boot_cmd) }//紧接着存放所有.o文件中段属性为.u_boot_的程序段,该段是用户自定义段,用来存放u-boot命令
__u_boot_cmd_end = .;           //外部变量 __u_boot_cmd_end的值为当前定位器的值,u-boot源码中会使用该变量

. = ALIGN(4);                   //调整.定位器的值,使它能够4字节对齐
__bss_start = .;                //外部变量 __bss_start的值为当前定位器的值,u-boot源码中会使用该变量
.bss : { *(.bss) }              //紧接着存放所有.o文件中的未初始化的全局变量
_end = .;                       //外部变量 _end的值为当前定位器的值,u-boot源码中会使用该变量
}
链接程序就可以根据上面的链接脚本将大量编译好的.o文件链接生成一个.bin文件

上面的程序的VMA地址是从0x00000000处开始的,但是很多时候我们要求VMA从某个地址开始,所以我们可以通过设置/board/xxxx/config.mk文件来指定u-boot的VMA的开始基地址,该文件只定义了一个变量TEXT_BASE = 0x33D00000(针对TQ2440)

然后在程序编译的时候,config.mk和u-boot.lds共同决定了程序的VMA起始地址。

参考文件

Linux链接脚本详解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  u-boot u-boot.lds