1.前言
本文主要结合The GNU Linker就uboot.lds链接文件进行注释。
U-boot版本:u-boot-2016.11
2. u-boot.lds注释
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
//定义三种输出文件的格式(大小端) //若有命令行选项-EB, 则使用第2个BFD格式;
//若有命令行选项-EL,则使用第3个BFD格式.否则默认选第一个BFD格式
OUTPUT_ARCH(arm)
//设置输出文件的machine architecture(体系结构),BFDARCH为被BFD库使用的名字之一。可以用命令objdump
-f查看。
ENTRY(_start)
//将符号_start的值设置成入口地址
SECTIONS
{
//SECTIONS-COMMAND格式
. = 0x00000000;
//定位符
. = ALIGN(4);
//4字节对齐
.text :
{
*(.__image_copy_start)
*(.vectors)
arch/arm/cpu/armv7/start.o (.text*)
*(.text*)
}
//输出section text,以下输入section将依次摆放
//如果没有该选项且有region选项,那么连接器将根据region设置VMA;
如果也没有 > REGION选项,那么连接器将根据定位符号‘.’的值设置该section的VMA
//所有文件的输入section __image_copy_start放入输出section text
/所有文件的输入section vectors放入输出section text
//arch/arm/cpu/armv7/start.o文件的.text放入输出section text
//所有文件的输入section .text放入输出section text
.__secure_start :
ALIGN(CONSTANT(COMMONPAGESIZE))
{
KEEP(*(.__secure_start))
}
//输出section __secure_start //KEEP告诉链接器不要优化掉此输入section,
即使没有引用到此section
.secure_text :
AT(ADDR(.__secure_start) + SIZEOF(.__secure_start))
{
*(._secure.text)
}
//输出section secure_text //指定LMA加载地址为.__secure_start) +
SIZEOF(.__secure_start)
.secure_data : AT(LOADADDR(.secure_text) + SIZEOF(.secure_text))
{
*(._secure.data)
}
//输出section secure_data //AT指定LMA为LOADADDR(.secure_text) +
SIZEOF(.secure_text)
.__secure_end : AT(ADDR(.__secure_end)) {
*(.__secure_end)
LONG(0x1d1071c);
}
//输出section __secure_end //LONG用于在输出section中嵌入字节0x1d1071c
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
//输出section rodata
. = ALIGN(4);
.data : {
*(.data*)
}
//输出section data
. = ALIGN(4);
. = .;
. = ALIGN(4);
.u_boot_list : {
KEEP(*(SORT(.u_boot_list*)));
}
//输出section u_boot_list
. = ALIGN(4);
.__efi_runtime_start : {
*(.__efi_runtime_start)
}
//输出section __efi_runtime_start
.efi_runtime : {
*(efi_runtime_text)
*(efi_runtime_data)
}
//输出section efi_runtime
.__efi_runtime_stop : {
*(.__efi_runtime_stop)
}
//输出section __efi_runtime_stop
.efi_runtime_rel_start :
{
*(.__efi_runtime_rel_start)
}
//输出section efi_runtime_rel_start
.efi_runtime_rel : {
*(.relefi_runtime_text)
*(.relefi_runtime_data)
}
//输出section efi_runtime_rel
.efi_runtime_rel_stop :
{
*(.__efi_runtime_rel_stop)
}
//输出section efi_runtime_rel_stop
. = ALIGN(4);
.image_copy_end :
{
*(.__image_copy_end)
}
//输出section image_copy_end
.rel_dyn_start :
{
*(.__rel_dyn_start)
}
//输出section rel_dyn_start
.rel.dyn : {
*(.rel*)
}
//输出section rel.dyn
.rel_dyn_end :
{
*(.__rel_dyn_end)
}
//输出section rel_dyn_end
.end :
{
*(.__end)
}
//输出section end
_image_binary_end = .;
. = ALIGN(4096);
.mmutable : {
*(.mmutable)
}
//输出section mmutable
.bss_start __rel_dyn_start (OVERLAY) : {
KEEP(*(.__bss_start));
__bss_base = .;
}
//输出section bss_start,VMA为__rel_dyn_start
.bss __bss_base (OVERLAY) : {
*(.bss*)
. = ALIGN(4);
__bss_limit = .;
}
//输出section bss
.bss_end __bss_limit (OVERLAY) : {
KEEP(*(.__bss_end));
}
//输出section bss_end
.dynsym _image_binary_end : { *(.dynsym) }
.dynbss : { *(.dynbss) }
.dynstr : { *(.dynstr*) }
.dynamic : { *(.dynamic*) }
.plt : { *(.plt*) }
.interp : { *(.interp*) }
.gnu.hash : { *(.gnu.hash) }
.gnu : { *(.gnu*) }
.ARM.exidx : { *(.ARM.exidx*) }
.gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) }
}