uboot.lds (一)

lds文件与scatter文件相似都是决定一个可执行程序的各个段的存储位置,以及入口地址,这也是链接定位的作用。U-boot的lds文件说明如下:

SECTIONS{

...

secname start BLOCK(align)(NOLOAD):AT(ldadr)

{contents}>region:phdr = fill

...

}

secname和contents是必须的,前者用来命名这个段,后者用来确定代码中的什么部分放在这个段,以下是这个描述中的一些关键字的解释。

1、secname :段名

2、contents :决定哪些内容放在本段,可以使整个目标文件,也可以是目标文件中的某段(代码段,数据段等)

3、start:是段的重定位地址,本段连接(运行)的地址, 如果代码中有位置无关指令,程序运行时这个段必须放在这个地址上,start可以用任意一种描述地址的符号来描述。

4、AT(ldar):定义本段存储(加载)的地址,如果不使用这个选项,则加载地址等于运行地址通过这个选项可以控制各个分段分别保存于输出文件中的不同位置

例如:

/*nand.lds*/

SECTIONS {

first 0x00000000:{head.o init.o}

second 0x30000000:AT(4096) {main.o}

}

 1  1 //下面是   u-boot-1.1.6/board/smdk2410
 2  2 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
 3  3 //指定输出可执行文件是elf格式,32位ARM指令,小端*/
 4  4 OUTPUT_ARCH(arm)
 5  5 //指定输出可执行文件的平台为ARM*/
 6  6 ENTRY(_start)
 7  7 //指定函数入口点为_start。cpu/arm920t/start.S中定义。
 8  8 SECTIONS
 9  9 {
10 10 //指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。必须使编译器知道这个地址,通常都是修改此处来完成*/
11 11    . = 0x00000000;             //从0x0位置开始*/
12 12    . = ALIGN(4);                //代码以4字节对齐*/
13 13    .text    :
14 14    {
15 15    cpu/arm920t/start.o (.text) //代码的第一个代码部分*/
16 16    *(.text)                       //其它代码部分*/
17 17    }
18 18    . = ALIGN(4);
19 19    .rodata : { *(.rodata) }    //指定只读数据段*/
20 20    . = ALIGN(4);
21 21    .data : { *(.data) }           //指定读/写数据段*/
22 22    . = ALIGN(4);
23 23    .got : { *(.got) }          //指定got段, got段式是uboot自定义的一个段, 非标准段*/
24 24    . = .;
25 25                                      //把__u_boot_cmd_start赋值为当前位置, 即起始位置*/
26 26    __u_boot_cmd_start = .;
27 27                                      //指定u_boot_cmd段, uboot把所有的uboot命令放在该段.*/
28 28    .u_boot_cmd : { *(.u_boot_cmd) }
29 29                                      //把__u_boot_cmd_end赋值为当前位置,即结束位置*/
30 30    __u_boot_cmd_end = .;
31 31    . = ALIGN(4);
32 32    __bss_start = .;             //把__bss_start赋值为当前位置,即bss段的开始位置*/
33 33    .bss : { *(.bss) }          //指定bss段*/
34 34    _end = .;                   //把_end赋值为当前位置,即bss段的结束位置*/
35 35 }
时间: 2024-10-11 17:42:45

uboot.lds (一)的相关文章

uboot之uboot.lds文件分析

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*指定输出可执行文件是elf格式,32位ARM指令,小端*/OUTPUT_ARCH(arm) /*指定输出可执行文件的平台为ARM*/ENTRY(_start) /*指定输出可执行文件的起始代码段为_start*/SECTIONS{ /*指定可执行image文件的全局入口点,通常这个地址都放在ROM(fl

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

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的目录结构,提及到了程序入口st

u-boot.lds文件简介

可执行文件由许多链接在一起的对象文件组成.对象文件有许多节,如文本.数据.init 数据.bss等.这些对象文件都是由一个称为 链接器脚本(*lds)的文件链接并装入的.这个链接器脚本的功能是将输入对象文件的各节映射到输出文件中:换句话说,它将所有输入对象文件都链接到单一的可执行文件中,将该可执行文件的各节装入到指定地址处. 因此在分析u-boot代码是,首先应关注的是u-boot.lds文件,它位于$(U-BOOT_SRC_ROOT)/board/$(BOARD_NAME)目录下. 1 /*

arm处理器的u-boot.lds文件分析

1)u-boot的实现分为stage1与stage2两个阶段,其中依赖与CPU体系结构的代码通常都是放在stage1里,并且通常用汇编语言实现.stage2通常用C语言实现,可以实现更加复杂的功能,并且有更好的移植性与可读性. 2)U-Boot 的 Stage1 通常是在 start.S 文件中实现,并且都是用汇编语言编写.一个可执行性 image 文件必须有一个入口点, 并且只能有一个全局入口点, 通常这个入口点的地址放在 ROM(Flash)0x0 位置,因此必须使编译器知道这个入口地址,该

U-boot.lds文件分析

1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 2 OUTPUT_ARCH(arm) 3 ENTRY(_start) lds文件位于board/samsung/smdk6410/u-boot-nand.lds下. 指定elf32-littlearm 格式,即指定输出文件是elf格式,32位ARM指令,小端模式: 紧接着OUTPUT_ARCH(arm)

U-Boot移植之前期分析(上)

老是看别人移植uboot,用别人移植好的uboot,今天终于下定决心自己移植一个uboot来玩玩,好歹我也是个软件开发人员啊. 第一步:去ftp://ftp.denx.de/pub/u-boot/网站下载个uboot工程源码,为了防止环境出问题,我决定用个老一点的,于是就下了:u-boot-1.1.6.tar.bz2. 第二步:解压源码:tar  jxvf  u-boot-1.1.6.tar.bz2. 第三步:建立source insight工程 好了完成以上三步之后,我们需要的前提条件都准备好

u-boot中链接地址和加载地址的相关知识

以zc702开发板的u-boot为例 链接地址(运行地址):链接地址是在程序编译链接阶段就确定好的地址. u-boot的链接脚本由CONFIG_SYS_LDSCRIPT宏定义来指定,如在zynq_common.h当中有如下代码: #define CONFIG_SYS_LDSCRIPT "arch/arm/cpu/armv7/zynq/u-boot.lds" 在该链接脚本中指定了u-boot中各部分的链接顺序.同时zynq_common.h中的CONFIG_SYS_TEXT_BASE则指

u-boot中的Makefile

在windos下,pc机上电之后,BIOS会初始化硬件配置,为内核传递参数,引导操作系统启动,并且识别C盘.D盘.等整个操作系统启动起来之后,才可以运行应用程序比如QQ.QQ音影.同理,在嵌入式Linux操作系统中,bootloader在上电之后初始化硬件设备,引导Linux内核启动,并且挂在文件系统,等整个操作系统启动之后.运行应用程序.              bootloader其实就是一个单片机程序,一般采用开发的语言是汇编和C语言,但是不同的硬件平台下的boot是不同的.booloa

u-boot分析(三)---boot命令实现以及内核的启动

上片博文总结出了u-boot的工作流程,今天我们来分析,u-boot的两个比较重要的内容 1.        U-boot命令的实现 2.        U-boot如何启动内核 l  命令实现 我们的u-boot可以解析输入的命令,比如print.setenv.saveenv等命令,我们下来对其的实现进行分析. 我们昨天分析到BL2最后停在了main_loop处,那么我们输入的命令肯定也是在这个函数中实现的,我们找到该函数,在main_loop函数中run_command函数很容易引起我们的关