u-boot.lds链接文件解析

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.*) }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值