(七)uboot.lds文件分析分析(Makefile源码分析)
(1)如果定义了CONFIG_NAND_U_BOOT宏,则链接脚本叫u-boot-nand.lds.如果未定义这个宏则叫u-boot.lds。
(2)从字面意思分析可知CONFIG_NAND_U_BOOT是在Nand下才使用。
(3)实际在board\samsung\x210目录下有u-boot.lds,这个就是链接脚本。我们在分析uboot的编译过程时就要考虑这个链接脚本。
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*///指定输出可执行文件是elf格式,32位ARM指令,小端*/
OUTPUT_ARCH(arm)//指定输出可执行文件的平台为ARM*/
ENTRY(_start)//指定函数入口点为_start。cpu/arm920t/start.S中定义。用来指定整个程序的入口地址,所谓入口地址就是我们整个程序的开头地址,可以认为是整个程序的第一句指令。有点像C语言中的main()
SECTIONS //裸机的链接脚本也一样。无非就指定当前地址,然后代码段、数据段、BSS段三个段
{
. = 0x00000000; //从0x0位置开始,在裸机中指定程序的链接地址有2种方法:一种是
//Makefile的flags中用-Ttext 0x20000000来指定;第二种是在链接脚本
//SECTIONS开头用.=0x20000000来指 // 定,两种效果相同。这两种技巧可以共同配合的,以-Ttext为准。(uboot的
//最终链接的起始地址是在makefile中用-Ttext来指定的,注意TEXT_BASE变量
//(最终来源是Makefile中配 //置对应的命令中, make_xxx_config中))
. = ALIGN(4); //代码以4字节对齐*/
. = ALIGN(4); //代码以4字节对齐*/
.text :
{
cpu/s5p64xx/start.o (.text)
cpu/s5p64xx/start_irom.o (.text)
cpu/s5p64xx/s5p6440/cpu_init.o (.text)
board/samsung/smdk6440/lowlevel_init.o (.text)
cpu/s5p64xx/nand_cp.o (.text)
cpu/s5p64xx/movi.o (.text)
*(.text)
lib_arm/div0.o
}
. = ALIGN(4);
.rodata : { *(.rodata) } //指定只读数据段*/
. = ALIGN(4);
.data : { *(.data) } //指定读/写数据段*/
. = ALIGN(4);
.got : { *(.got) } //指定got段, got段式是uboot自定义的一个段, 非标准段*/
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .; //把__u_boot_cmd_end赋值为当前位置,即结束位置*/
. = ALIGN(4);
.mmudata : { *(.mmudata) }
. = ALIGN(4);
__bss_start = .; //把__bss_start赋值为当前位置,即bss段的开始位置*/
.bss : { *(.bss) } //指定bss段*/
_end = .; //把_end赋值为当前位置,即bss段的结束位置*/
}