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

Posted 行稳方能走远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了U-Boot顶层目录链接脚本文件(u-boot.lds)介绍(*)相关的知识,希望对你有一定的参考价值。

参考:U-Boot顶层目录链接脚本文件(u-boot.lds)介绍
作者:一只青木呀
发布时间: 2020-10-23 13:52:23
网址:https://blog.csdn.net/weixin_45309916/article/details/109240625

要分析 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 配置、选用不同的优化等级等等都会影响到这些值。所以,一切以实际值为准

以上是关于U-Boot顶层目录链接脚本文件(u-boot.lds)介绍(*)的主要内容,如果未能解决你的问题,请参考以下文章

嵌入式开发(S5PV210)——u-boot的顶层Makefile分析

Linux系统移植:U-Boot 顶层 Makefile 分析(上)

嵌入式Linux8.链接脚本 u-boot.lds

嵌入式Linux8.链接脚本 u-boot.lds

u-boot顶层目录config.mk分析

嵌入式开发(S5PV210)——u-boot的顶层mkconfig文件分析