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可以用任意一种描述地址的符号来描述。

例如:

/*nand.lds*/
SECTIONS {first 0x00000000:{head.o init.o}second 0x30000000:AT(4096) {main.o}
}

以上,head.o放在0x00000000地址开始处,init.o放在head.o后面他的运行地址也是0x00000000,即连接地址和存储地址相同 (没有AT指定);
main.o放在4096(0x1000是AT指定的存储地址)开始处,但他的运行地址在0x30000000,运行之前需要从0x1000(加载地址)复制到0x30000000(运行地址处),此过程也就需要读取flash,把程序拷贝到相应位置才能运行。这就是存储地址和运行的不同,称为加载时域和运行时域可以在.lds连接脚本文件中分别制定。

编写好的.lds文件,在用arm-linux-ld连接命令时带-Tfilename来调用执行,如

arm-linux-ld -Tnand.lds x.o y.o -o xy.o

也可用-Ttext参数直接指定连接地址如:

arm-linux-ld -Ttext 0x30000000 x.o y.o -o xy.o

既然程序有了 两种地址,就涉及到一些跳转指令的区别

  1. b step: b跳转指令是相对跳转,依赖当前PC的值,偏移量是通过该指令本身的bit[23:0]算出来的,这使得使用b指令的不依赖于要跳到的代码的位置,只看指令本身。

  2. ldr pc,=step;该指令是一个伪指令编译后会生成以下代码:

 ldr pc,0x30008000<0x30008000>step

是从内存中的某个位置(step)读出数据并赋给PC,同样依赖于当前PC的值,但是偏移量是step的连接地址(运行时的地址),所以可以用它实现从Flash到RAM的程序跳转

  1. 此外,有必要回味一下adr伪指令,U-boot中那段relocate代码就是通过adr实现当前程序是在RAM中还是在Flash中:
relocate:                        /*把u-boot重新定位到RAM*/
adr  r0,_start                 /*r0是代码的当前位置*/ldr  r1,_TEXT_BASE   /*测试判断从Flash启动,还是从RAM启动此句执行的结果r1始终是0x33FF80000*/                                                       /*因为此值是链接指定的*/
cmp r0,r1     /*比较r0和r1,调试的时候不要执行重定位*/

/adr伪指令,汇编器会自动通过当前PC的值得算出这条指令中“_start" 的值,执行到start时PC的值放到r0中:
当此段在flash中执行时 r0=_start=0;当此段在RAM中执行时_start=_TEXT_BASE(在board/smdk2410/config.mk)中指定的值为0x33F80000,即U-Boot在把代码拷贝到RAM中去执行的代码段的开始
/

iMX6U Uboot.lds 分析

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")指定输出可执行文件elf格式,32位ARM指令,小端模式
OUTPUT_ARCH(arm)                指定输入平台为ARM
ENTRY(_start)                   指定输出可执行文件的起始代码为_start _start 在文件arch/arm/lib/vectors.S
SECTIONS
{. = 0x00000000;               定位当前地址为0地址. = ALIGN(4);                    代码以4字节对齐.text :                     指定代码段{*(.__image_copy_start)        指定地址为 0X87800000*(.vectors)                 .vectors段vectors 段保存中断向量表,在vectors.S 中arch/arm/cpu/armv7/start.o (.text*)    arch/arm/cpu/armv7/start.s 的生成文件*(.text*)                       其他的代码段}. = ALIGN(4);.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }     指定只读数据段. = ALIGN(4);.data : {*(.data*)                     指定读写数据段}. = ALIGN(4);. = .;. = ALIGN(4);.u_boot_list : {KEEP(*(SORT(.u_boot_list*)));}. = ALIGN(4);.image_copy_end :{*(.__image_copy_end)}.rel_dyn_start :{*(.__rel_dyn_start)}.rel.dyn : {*(.rel*)}.rel_dyn_end :{*(.__rel_dyn_end)}.end :{*(.__end)}_image_binary_end = .;. = ALIGN(4096);.mmutable : {*(.mmutable)}.bss_start __rel_dyn_start (OVERLAY) : {KEEP(*(.__bss_start));__bss_base = .;}.bss __bss_base (OVERLAY) : {*(.bss*). = ALIGN(4);__bss_limit = .;}.bss_end __bss_limit (OVERLAY) : {KEEP(*(.__bss_end));}.dynsym _image_binary_end : { *(.dynsym) }.dynbss : { *(.dynbss) }.dynstr : { *(.dynstr*) }.dynamic : { *(.dynamic*) }.plt : { *(.plt*) }.interp : { *(.interp*) }.gnu.hash : { *(.gnu.hash) }.gnu : { *(.gnu*) }.ARM.exidx : { *(.ARM.exidx*) }.gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) }
}

uboot.lds 链接文件分析相关推荐

  1. uboot.lds链接脚本分析

     LDFLAGS += -Bstatic -T /board/smdk2410/u-boot.lds -Ttext 0x33F80000中-Ttext 0x33F80000是指定代码段text的首地址 ...

  2. u-boot.lds详细的分析

    对u-boot.lds的更详细的分析 Linker Script Format Linker scripts are text files. You write a linker script as ...

  3. 嵌入式C语言编程中经验教训总结(二)LDS链接文件解析

    目录 为什么要用到lds链接脚本? lds文件语法结构 lds文件实例解析 好的朋友已经做过好多年的arm开发,却对底层的编译链接逻辑很少接触,主要原因在于现在大多数应用层的开发不需要从裸板开始,工程 ...

  4. U-Boot源码目录分析(VScode工程创建及文件夹过滤)

    参考:U-Boot工程目录介绍 作者:一只青木呀 发布时间: 2020-10-21 14:47:30 网址:https://blog.csdn.net/weixin_45309916/article/ ...

  5. makefile使用.lds链接脚本以及 $@ ,$^, $, 解析

    先来分析一个简单的.lds链接脚本 例1,假如现在有head.c init.c nand.c main.c这4个文件: 1.1 首先创建链接脚本nand.lds: 1 SECTIONS { 2 fir ...

  6. U-Boot启动过程完全分析

    1.1       U-Boot工作过程 U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能 Ø  硬件设备初始化 Ø  加载U-Boot第二阶段代码到RAM空间 ...

  7. 16.U-boot的工作流程分析-2440

    16.U-boot的工作流程分析-2440 分析的流程: 程序入口 第一阶段程序分析 第二阶段程序分析 2440开发板: 1.uboot的入口: 要看uboot工程的入口,首先打开顶层目录的Makef ...

  8. 基于S3C2440的U-BOOT的start.S分析

    在了解了ARM相关的汇编指令后,同时结合网上各位大虾的提点开始阅读u-boot的启动代码,现将分析过程记录如下 可执行文件及内存映射 我们可以把可执行文件分为2种情况:存放态和运行态 1.存放态:可执 ...

  9. U-boot主循环main_loop分析

    2019独角兽企业重金招聘Python工程师标准>>> 原文在我博客:http://blog.csdn.net/andy_wsj/article/details/8614905 最近 ...

最新文章

  1. word vba高效排版范例应用_Word 排版指北丨高效律师
  2. Apache Flink 零基础入门(二十)Flink kafka connector
  3. ​FreeSWITCH视频会议“标准”解决方案
  4. 《计算机网络自顶向下》知识体系完全梳理
  5. LeetCode 2200. 找出数组中的所有 K 近邻下标
  6. Android应用发布渠道汇总(更新中)
  7. 在线验证json字符串
  8. Android——DDMS简单介绍
  9. 如果 AI 技术可以让你永生,你愿意么?
  10. python 计算机程序设计-某高校计算机编程教授教你如何快速入门python,一文带你进入编程...
  11. 我的大数据方法论:求扔砖
  12. 【poj1743-Musical Theme】不可重叠最长重复子串-后缀数组
  13. EXCEL 利用随机数公式生成随机字母、随机密码
  14. oracle 按汉字拼音顺序排序
  15. 鸿蒙系统我的二次元之旅,创世神的二次元
  16. SQA软件质量保证工程师工作职责与素质要求
  17. 统计学习理论(SLT)与支持向量机(SVM)
  18. python Flask 编写 api 接口,CORS 解决 flask 跨域问题
  19. 数学之美读书感悟01
  20. R语言中var的用法

热门文章

  1. iOS和Android上的本机心理健康监控:现在不是时候了吗?
  2. python 不安全的包或方法_Python中的10个常见安全漏洞及修复方法
  3. 施乐700彩机服务器维修,佳铭办公设备:施乐彩机维修代码
  4. 如何用MATLAB叠加傅里叶级数,傅里叶级数展开matlab实现
  5. 2021-07-05
  6. 数字集成电路设计-12-状态机的四种写法
  7. 【AtCoder】【模拟】【模型转化】Camel and Oases(AGC012)
  8. 【AGC012E】 Camel and Oases ST表+状压dp
  9. iis7 winmail php,MagicWinmailServer
  10. c语言程序设计臧,臧学莲