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.o | 0x87800300 | strrt.c |
__image_copy_start | 0x87800000 | uboot 拷贝的首地址 |
__image_copy_end | 0x8785dd54 | uboot 拷贝的结束地址 |
__rel_dyn_start | 0x8785dd54 | .rel.dyn 段起始地址 |
__rel_dyn_end | 0x878668f4 | .rel.dyn 段结束地址 |
_image_binary_end | 0x878668f4 | 镜像结束地址 |
__bss_start | 0x8785dd54 | .bss 段起始地址 |
__bss_end | 0x878a8e74 | .bss 段结束地址 |
上表中的“变量”值可以在 u-boot.map 文件中查找,上表中除了__image_copy_start以外,其他的变量值每次编译的时候可能会变化,如果修改了 uboot 代码、修改了 uboot 配置、选用不同的优化等级等等都会影响到这些值。所以,一切以实际值为准
以上是关于U-Boot顶层目录链接脚本文件(u-boot.lds)介绍(*)的主要内容,如果未能解决你的问题,请参考以下文章
嵌入式开发(S5PV210)——u-boot的顶层Makefile分析