u-boot链接脚本解析

本文详细介绍了U-Boot的链接脚本(.lds)的作用和解析,探讨了程序的加载时域和运行时域,以及代码在镜像文件中的位置。连接脚本用于指定程序段的存储位置,U-Boot等Bootloader因存储器限制常采用位置无关代码。文章通过实例解析了.lds文件的符号和段定义,并分析了运行地址与加载地址不一致的情况,强调了地址无关代码的重要性。最后,文章讨论了U-Boot移植中运行地址和装载地址的区别,并以SMDK2410为例,展示了如何从NOR Flash启动时的映射和代码跳转到SDRAM的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、关于编译连接脚本

连接脚本是用来描述输出文件的内存布局。

GNU编译器生成的目标文件缺省为elf格式,elf文件由若干段(section)组成,如不特殊指明,由C源程序生成的目标代码中包含如下段:.text(正文段)包含程序的指令代码;.data(数据段)包含固定的数据,如常量、字符串;.bss(未初始化数据段)包含未初始化的变量、数组等。C++源程序生成的目标代码中还包括.fini(析构函数代码)和.init(构造函数代码)等.链接器的任务就是将多个目标文件的.text、.data和.bss等段连接在一起,而连接脚本文件是告诉链接器从什么地址开始放置这些段.简而言之,由于一个工程中有多个.c文件,当它们生成.o文件后如何安排它们在可执行文件中的顺序,这就是链接脚本的作用.

gcc等编译器内置有缺省的连接脚本;但采用缺省脚本,则生成的目标代码需要操作系统才能加载运行。而对于uboot这种需要在嵌入式系统上直接运行的程序,就不能使用编译器缺省脚本、而必须由我们编写连接脚本。

源代码经过编译器编译后包含如下段:

正文段text:包含程序的指令代码;

数据段data:包含固定的数据,如常量和字符串;

未初始化数据段:包含未初始化的变量、数组等。

连接器的任务是将多个编译后的文件的text、data和bass等段连接在一起;而连接脚本文件就是告诉连接器从什么地址(运行时地址)开始放置这些段。

二、arm程序的加载时域和运行时域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值