u-boot.lds脚本分析
1.
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
原型OUTPUT_FORMAT(DEFAULT,BIG,LITTLE)
OUTPUT_FORMAT的目的是指定输出目标文件的格式,三个选项分别指定在缺省、大段、小端情况下的输出可执行文件格式。当命令行中带有-EB则使用第二个格式(BIG),当命令行中带有-EL则使用第三个格式(LITTLE),如果这两个都不带则使用第一个格式(DEFAULT)。此处三种都被设置为elf32-littlearm,意思是可执行文件输出格式是elf32,小端和ARM体系结构
2.
OUTPUT_ARCH(arm)
指定输出可执行文件的硬件平台是ARM
原型: OUTPUT_ARCH(BFDARCH)
设置输出文件的体系结构,BFDARCH为被BFD库使用的名字之一(arm便是其中之一)
3.
ENTRY(_start)
指定启动时的函数入口地址,_start在每个CPU目录下的start.S中定义,真正的启动运行地址段在编译时在/u-boot-1.1.6/board/smdk2410/config.mk中由TEXT_BASE宏定义。
4.
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
board/smdk2440/boot_init.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(.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 = .;
}
SECTIONS其实可以理解为一个内存布局的描述。首先我们来看一个特殊的标示符“.”,它是一个定位符,例如. = 0x00000000 表示当前位置从0x0开始。位置标识符可以自动向上增长随着后边段的增加,例如在(.text)段后面“.”的值为0x0+size(.text)。总是“.”就是指定后面输出段的位置,如果没有指定,则继续紧接着往后面放。.= ALIGN(4) 是指四字节对齐。.text:{(*.text)},.data:{(*.data)}等都是固定死的格式,我们可以把我们的需要的文件提取出来,例如
.text :
{
cpu/arm920t/start.o (.text)
board/smdk2440/boot_init.o (.text)
*(.text)
}
这样可以将start.o放在.text段的首地址,然后接着存放boot_init.o