对于不少新人朋友来说,可能想问,u-boot.lds这个文件是干什么的?
其实,它的作用很简单,那就是:定义了整个程序编译之后的连接过程,决定了一个可执行程序的各个段的存储位置。
接下来,我们根据具体的源码进行简要的分析。
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
//指定输出可执行文件是elf格式,32位arm指令,小端储存
OUTPUT_ARCH(arm)
//指定输出可执行文件所运行平台为arm
ENTRY(_start)
//指定可执行文件的入口段为_start
SECTIONS
{
. = 0x00000000; //代码从0x00000000地址开始执行
. = ALIGN(4); //代码以4字节对齐
.text : //指定代码段位置
{
board/freescale/mx6q_s401/flash_header.o (.text.flasheader) //代码的第一个代码部分
cpu/arm_cortexa8/start.o //代码的第二个部分,下面同理
board/freescale/mx6q_s401/libmx6q_s401.a (.text)
lib_arm/libarm.a (.text)
net/libnet.a (.text)
drivers/mtd/libmtd.a (.text)
drivers/mmc/libmmc.a (.text)
. = DEFINED(env_offset) ? env_offset : .;
common/env_embedded.o(.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } //指定只读数据段
. = ALIGN(4);
.data : { *(.data) } //指定读/写数据段
. = ALIGN(4);
.got : { *(.got) } //指定got段,它是uboot自定义的一个段,用于存储全局变量
. = .;
__u_boot_cmd_start = .; //把u_boot_cmd_start赋值为当前位置,即起始位置
.u_boot_cmd : { *(.u_boot_cmd) } //指定u_boot_cmd段,uboot把所有的uboot命令放在该段
__u_boot_cmd_end = .; //把u_boot_cmd_end赋值为当前位置,即结束位置
. = ALIGN(4);
_end_of_copy = .;
. = ALIGN(0x1000);
__hab_data = .;
. = . + 0x2000;
__data_enc_key = .;
. = . + 0x200;
__hab_data_end = .;
__bss_start = .; //把bss_start赋值为当前位置,即bss段的开始位置
//BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会自动清0。
.bss : { *(.bss) } //指定bss段
_end = .; //把_end赋值为当前位置,即bss段的结束位置
. = ALIGN(0x4000);
__mmutable_start = .;
.mmutable (NOLOAD) : { *(.mmutable) }
__mmutable_end = .;
}