u-boot链接脚本

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)