具体的过程需要先阅读u-boot.lds文件,这个文件在arch/arm/cpu目录下,具体内容如下:
OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm");
//定义输出格式为小端模式
OUTPUT_ARCH(arm) ;定义输出的架构为arm体系结构
ENTRY(_start) ;u-boot的入口地址为_start
SECTIONS
{
. = 0x00000000 ;起始地址为0X00000000
. = ALIGN(4) ;四字节对齐方式
.text :
{ ;映像文件复制起始地址
__image_copy_start = . ; __image_copy_start的值为当前地址即0X00000000
CPUDIR/start.o (.text) ;对应 start.s
*(.text) ;其它代码依此存放
}
. = ALIGN(4) ;四字节对齐
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
.data : { ;数据段
*(.data)
}
. = ALIGN(4);
. = .;
__u_boot_cmd_start = . ;__u_boot_cmd_start的起始地址为命令存放区域的首地址
.u_boot_cmd : { *(.u_boot_cmd) } ;命令存放区
__u_boot_cmd_end = . ;命令存放区末地址
. = ALIGN(4);
__image_copy_end = . ;映像文件复制结束地址
.rel.dyn : { ;用于动态连接的重定位信息
__rel_dyn_start = .;
*(.rel*)
__rel_dyn_end = . ;
}
.dynsym : { ;.dynsym动态符号表,这个表只保存了与动态链接相关的符号
__dynsym_start = . ;这是动态连接符号表的数据结构部分,须与.dynstr联用。
*(.dynsym)
}
_end = .;
. = ALIGN(4096);
.mmutable : {
*(.mmutable)
}
.bss __rel_dyn_start (OVERLAY) : {
__bss_start = .;
*(.bss)
. = ALIGN(4);
__bss_end__ = .;
}
/DISCARD/ : { *(.dynstr*) } ;动态连接符号表的字符串部分,与.dynsym联用
/DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) } ;过程连接表(Procedure Linking Table)
/DISCARD/ : { *(.interp*) }
/DISCARD/ : { *(.gnu*) }
}