U-Boot顶层目录链接脚本文件(u-boot.lds)介绍

链接脚本 u-boot.lds 介绍

要分析 uboot 的启动流程,首先要找到“入口”,找到第一行程序在哪里。程序的链接是由
链接脚本来决定的,所以通过链接脚本可以找到程序的入口。如果没有编译过 uboot 的话链接
脚本为 arch/arm/cpu/u-boot.lds。但是这个不是最终使用的链接脚本,最终的链接脚本是在这个
链接脚本的基础上生成的。编译一下 uboot,编译完成以后就会在 uboot 根目录下生成 u-boot.lds
文件,如下图所示:
在这里插入图片描述
只有编译 u-boot 以后才会在根目录下出现 u-boot.lds 文件!

1、u-boot.lds文件

打开 u-boot.lds,内容如下:

在这里插入图片描述
在这里插入图片描述
第 3 行为代码当前入口点: _start, _start 在文件 arch/arm/lib/vectors.S 中有定义,如图下所示:

2、arch/arm/lib/vectors.S 文件

在这里插入图片描述
从上图可以看出, _start 后面就是中断向量表,从图中的“.section “.vectors”, "ax”可以得到,此代码存放在.vectors 段里面。

3、u-boot.map(地址映射文件)

打开 u-boot.map(地址映射文件):
在这里插入图片描述
u-boot.map 是 uboot 的映射文件,可以从此文件看到某个文件或者函数链接到了哪个地址,从上图932 行可以看到__image_copy_start 为 0X87800000,而.text 的起始地址也是0X87800000。

4、链接文件分析

.text(代码段)描述
*(.__image_copy_start)uboot 拷贝的首地址

在链接文件中第 10 行*(.__image_copy_start) 在映射文件中可以看到地址为 0X87800000,而.text 的起始地址也是0X87800000。

在链接文件中第 11 行是 vectors 段, vectors 段保存中断向量表,从u-boot.lds文件我们知道了 vectors.S 的代码是存在 vectors 段中的。从地址映射文件中, vectors 段的起始地址也是 0X87800000,说明整个 uboot 的起始地址就是 0X87800000。

在链接文件中第 12 行将 arch/arm/cpu/armv7/start.s 编译出来的代码放到中断向量表后面。

在链接文件中第 13 行为 text 段,其他的代码段就放到这里

在链接文件中第 16 行 .rodata只读数据段(一般存放常量)

在链接文件中第 18 行,数据段 (一般存放已初始化的全局和静态变量)

在链接文件中第 24 行 ,.u_boot_list段

在链接文件中第 28 行, .image_copy_end:uboot 拷贝的结束地址

在链接文件中第 32 行,.rel_dyn_start:.rel.dyn 段起始地址

在链接文件中第 39 行,.rel_dyn_end:.rel_dyn段结束地址

在链接文件中第 52 行,.bss_start:.bss 段起始地址(静态数据区,一般存放未初始化的全局和静态变量)

在链接文件中第 61 行,.bss_end:.bss段结束

总结

变量数值描述
*(.vectors)0x87800000中断向量表
arch/arm/cpu/armv7/start.o0x87800300strrt.c
__image_copy_start0x87800000uboot 拷贝的首地址
__image_copy_end0x8785dd54uboot 拷贝的结束地址
__rel_dyn_start0x8785dd54.rel.dyn 段起始地址
__rel_dyn_end0x878668f4.rel.dyn 段结束地址
_image_binary_end0x878668f4镜像结束地址
__bss_start0x8785dd54.bss 段起始地址
__bss_end0x878a8e74.bss 段结束地址

上表中的“变量”值可以在 u-boot.map 文件中查找,上表中除了__image_copy_start以外,其他的变量值每次编译的时候可能会变化,如果修改了 uboot 代码、修改了 uboot 配置、选用不同的优化等级等等都会影响到这些值。所以,一切以实际值为准

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值