转:u-boot分析三(u-boot.lds脚本)

author author     2022-09-20     381

关键词:

u-boot分析 三 (u-boot.lds脚本)

转自:http://blog.csdn.net/itxiebo/article/details/50938753

 

目的,
了解链接器用到的脚本文件u-boot.lds。

在开始这篇博文之前,需要先了解一些GNU linker script的基本知识,可以参考博主的另外一篇分享《GNU linker script,ld script,GNU链接脚本》

在《u-boot分析 二》中,我们分析u-boot的目录结构,提及到了程序入口start.S,但在开始了解start.S之前,我们先聊聊链接器ld程序的脚本文件u-boot.lds。

下面我们就来品味一下UT4418开发板的u-boot.lds脚本,即u-boot/arch/arm/cpu/slsiap/u-boot.lds。如果读者正好需要看source code,可以参看之前的文章《u-boot分析 一》中的源码分享。

  1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
  2 /*指定输出可执行文件是elf格式,32位ARM指令,小端*/
  3 OUTPUT_ARCH(arm)
  4 /*指定输出可执行文件的平台为ARM*/
  5 ENTRY(_stext)
  6 /*指定输出可执行文件的起始代码段为_stext*/
  7 SECTIONS
  8 {
  9 /*指定可执行文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。必须使编译器知道这个地址,通常都是修改此处来完成*/
 10     . = 0x00000000;
 11     /*从0x0位置开始*/
 12     . = ALIGN(4);
 13     /*代码以4字节对齐*/
 14     .text :
 15     /*代码段*/
 16     {
 17         *(.__image_copy_start)
 18         /*u-boot将自己copy到RAM,此为需要copy的程序的start*/
 19         SOCDIR/start.o (.text*)
 20         /*./arch/arm/cpu/slsiap/s5p4418/start.S*/
 21         SOCDIR/vectors.o (.text*)
 22         /*./arch/arm/cpu/slsiap/s5p4418/vectors.S,异常向量表*/
 23         *(.text*)
 24         /*其他的代码段放在这里,即start.S/vector.S之后*/
 25     }
 26 
 27     . = ALIGN(4);
 28     /*代码段结束后,有可能4bytes不对齐了,此时做好4bytes对齐,以开始后面的.rodata段*/
 29     .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
 30     /*在代码段之后,存放read only数据段*/
 31     . = ALIGN(4);
 32     /*和前面一样,4bytes对齐,以开始接下来的.data段*/
 33     .data : {
 34         *(.data*)
 35         /*可读写数据段*/
 36     }
 37 
 38     . = ALIGN(4);
 39     /*和前面一样,4bytes对齐*/
 40     . = .;
 41 
 42     . = ALIGN(4);
 43     .u_boot_list : {
 44         KEEP(*(SORT(.u_boot_list*)));
 45         /*.data段结束后,紧接着存放u-boot自有的一些function,例如u-boot command等*/
 46     }
 47 
 48     . = ALIGN(4);
 49 
 50     .image_copy_end :
 51     {
 52         *(.__image_copy_end)
 53         /*至此,u-boot需要自拷贝的内容结束,总结一下,包括代码段,数据段,以及u_boot_list*/
 54     }
 55 
 56     .rel_dyn_start :
 57     /*在老的uboot中,如果我们想要uboot启动后把自己拷贝到内存中的某个地方,只要把要拷贝的地址写给TEXT_BASE即可,然后boot启动后就会把自己拷贝到TEXT_BASE内的地址处运行,在拷贝之前的代码都是相对的,不能出现绝对的跳转,否则会跑飞。在新版的uboot里(2013.07),TEXT_BASE的含义改变了。它表示用户要把这段代码加载到哪里,通常是通过串口等工具。然后搬移的时候由uboot自己计算一个地址来进行搬移。新版的uboot采用了动态链接技术,在lds文件中有__rel_dyn_start和__rel_dyn_end,这两个符号之间的区域存放着动态链接符号,只要给这里面的符号加上一定的偏移,拷贝到内存中代码的后面相应的位置处,就可以在绝对跳转中找到正确的函数。*/
 58     {
 59         *(.__rel_dyn_start)
 60     }
 61 
 62     .rel.dyn : {
 63         *(.rel*)
 64         /*动态链接符存放在的段*/
 65     }
 66 
 67     .rel_dyn_end :
 68     {
 69         *(.__rel_dyn_end)
 70         /*动态链接符段结束*/
 71     }
 72 
 73     .end :
 74     {
 75         *(.__end)
 76     }
 77 
 78     _image_binary_end = .;
 79     /*bin文件结束*/
 80 
 81     /*
 82      * Deprecated: this MMU section is used by pxa at present but
 83      * should not be used by new boards/CPUs.
 84      */
 85     . = ALIGN(4096);
 86     .mmutable : {  /*for MMU*/
 87         *(.mmutable)
 88     }
 89 
 90     /*
 91      * Compiler-generated __bss_start and __bss_end, see arch/arm/lib/bss.c
 92      * __bss_base and __bss_limit are for linker only (overlay ordering)
 93      */
 94     /*bss段的描述*/
 95     .bss_start (OVERLAY) : {
 96         KEEP(*(.__bss_start));
 97         __bss_base = .;
 98     }
 99 
100     .bss __bss_base (OVERLAY) : {
101         *(.bss*)
102          . = ALIGN(4);
103          __bss_limit = .;
104     }
105 
106     .bss_end __bss_limit (OVERLAY) : {
107         KEEP(*(.__bss_end));
108     }
109     /*bss段的描述结束*/
110     .dynsym _image_binary_end : { *(.dynsym) }
111     .dynbss : { *(.dynbss) }
112     .dynstr : { *(.dynstr*) }
113     .dynamic : { *(.dynamic*) }
114     .plt : { *(.plt*) }
115     .interp : { *(.interp*) }
116     .gnu.hash : { *(.gnu.hash) }
117     .gnu : { *(.gnu*) }
118     .ARM.exidx : { *(.ARM.exidx*) }
119     .gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) }
120 }

 


总结一下,u-boot.lds脚本文件告诉链接器linker如何布局代码段、数据段、bss段等,已经配置了u-boot自拷贝(从flash到RAM的copy)的内容。另外,还简要的涉及了动态链接技术等。



linux系统移植:u-boot链接脚本(代码片段)

文章目录Linux系统移植:U-Boot链接脚本一、u-boot.lds介绍二、u-boot.lds分析Linux系统移植:U-Boot链接脚本一、u-boot.lds介绍前面提到的U-Boot的本质就是一个大的裸机程序,执行的时候需要先找到程序入口,而程序的链接... 查看详情

嵌入式linux8.链接脚本u-boot.lds(代码片段)

...序的入口。如果没有编译过uboot的话链接脚本为arch/arm/cpu/u-boot.lds。但是这个不是最终使用的链接脚本,最终的链接脚本是在这个链接脚本的基础上生成的。编译一下uboot,编译完成以后就会在uboot根目录下生成u-boot.lds文件,如图... 查看详情

嵌入式linux8.链接脚本u-boot.lds(代码片段)

...序的入口。如果没有编译过uboot的话链接脚本为arch/arm/cpu/u-boot.lds。但是这个不是最终使用的链接脚本,最终的链接脚本是在这个链接脚本的基础上生成的。编译一下uboot,编译完成以后就会在uboot根目录下生成u-boot.lds文件,如图... 查看详情

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

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

armv8架构u-boot启动流程详细分析(代码片段)

1.u-bootarmv8链接脚本在进行源码分析之前,首先看看u-boot的链接脚本,通过链接脚本可以从整体了解一个u-boot的组成,并且可以在启动分析中知道某些逻辑是在完成什么工作。在armv8中,u-boot使用arch/arm/cpu/armv8/u-boot... 查看详情

u-boot.lds分析

OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")/*指定输出的格式是32bitsARM小端*//*OUTPUT_FORMAT("elf32-arm","elf32-arm","elf32-arm")指定输出的格式是32bitsARM小端。OUTPUT_FORMAT原型为OUTPUT_FORMAT(default 查看详情

u-boot代码分析--第一节(代码片段)

u-boot代码分析--第一节编者:weirdo时间:2020-5-12QQ:2651293248标题:u-boot代码分析第一节1.u-boot.lds文件?? 这里指的是顶层目录下面的u-boot.lds,这里需要注意的是这个文件是根据arch/arm/cpu/armvx/对应的u-boot.lds模板生成的,在不严格的... 查看详情

u-boot代码分析--第一节(代码片段)

u-boot代码分析--第一节编者:weirdo时间:2020-5-12QQ:2651293248标题:u-boot代码分析第一节1.u-boot.lds文件?? 这里指的是顶层目录下面的u-boot.lds,这里需要注意的是这个文件是根据arch/arm/cpu/armvx/对应的u-boot.lds模板生成的,在不严格的... 查看详情

buildroot构建项目---u-boot2017.11适配开发板修改1

...并不太适用。还得做一系列得修改。一、lds文件分析  u-boot中最重要得链接文件即是,u-boot.lds。我们可以查看我们编译出来得u-boot.lds文件进行分析,原始文件在arch/arm/cpu/下,编译出来得去掉了不想关得选项。  u-boot.lds脚... 查看详情

基于海思hi3516dv300的u-boot-2016.11分析(代码片段)

1.先看链接脚本文件u-boot.lds,文件位于u-boot-2016.11\arch\arm\cpu\armv7\hi3516dv300\hw_compressedOUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")OUTPUT_ARCH(arm)/*设置输出文件的架构体系为arm架构*/ENTRY(_star 查看详情

u-boot移植---修改前工作:代码流程分析1

一、代码执行总体流程图1.1代码路径 U-boot.lds(archarmcpu) vectors.S(archarmlib) start.S(archarmcpuarm920t) lowlevel_init.S(boardsamsungjz2440) crt0.S(archarmlib)relocate.S(archarmlib) 查看详情

u-boot移植---修改前工作:代码流程分析3---代码重定位

...链接时候的地址就会生成,然后存储在段里面,如下段(u-boot.lds):     查看详情

uboot

查找文件位置1:U-boot有几千个文件,所以要通过makfile来查找文U-boot文件的入口。2:查看芯片的配置文件smdk24403:在board目录里面的sumsing目录里面查找smdk2440目录里面存放的就是开发板相关的配置文件,其中最重要的是名字叫u-bo... 查看详情

u-boot之启动第一阶段(代码片段)

基于samsung的Exynos4412从链接脚本u-boot.lds中我们知道u-boot是从start.s这个汇编文件开始的,所以u-boot启动的第一阶段肯定也是从这里开始的,这个文件在cpu/arm_cortexa9/文件夹下,下面我们依照这个文件一步一步分析u-boot启动的第一阶... 查看详情

uboot源码简要分析

...关的文件。每个子目录中都包括cpu.c和interrupt.c、start.S、u-boot.lds。cpu.c:初始化CPU、设置指令Cache和数据Cache等interrupt.c:设置系统的各种中断和异常start.S:是U-boot启动时执行的第一个文件, 查看详情

uboot移植之start.s分析

...ENTTRY的入口参数,我们这里的链接脚本在board/samsung/x210/u-boot.lds,这个文件里面的开头有一句ENTRY(_start),所以uboot的入口就是在_start这个标识的地方。 * Base codes by scsuh (sc.suh) *///x210_s 查看详情

嵌入式linux9.u-boot启动流程详解

1.reset函数源码从u-boot.lds中我们已经知道了入口点是arch/arm/lib/vectors.S文件中的_start,代码如下 第48行_start开始的是中断向量表,其中54~61行就是中断向量表,和我们裸机例程里面一样。54行跳转到reset函数里面,reset函数在arch/... 查看详情

s5pv210-uboot源码分析-第一阶段

...1-启动第一阶段1、starts.S是我们uboot源码的第一阶段:从u-boot.lds链接脚本中也可以看出start.S是我们整个程序的入口处,怎么看出的呢,因为在链接脚本中有个ENTRY(_start)声明了_start是程序的入口。所以_start符号所在的文件,就是... 查看详情