uboot编译连接脚本文件uboot.lds

2024-03-15 14:38
文章标签 编译 uboot 连接 脚本 lds

本文主要是介绍uboot编译连接脚本文件uboot.lds,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因为内存的执行效率比较高,所以uboot的绝大部分功能应该在SDRAM内存中完成;即uboot在连接时,我们制定它的运行地址是0x30000000。

但CPU复位重启时,PC的默认值是0x00000000;因此,uboot开始部分(4KB)必须在0x00000000处执行;

这就存在PIC,即位置无关代码设计的问题,见ARM位置无关代码设计。

所以,为了让uboot能正常顺利执行;我们必须保证其前4KB部分是位置无关的。

也就是说:连接器armlink指定的程序运行地址、即生成可执行镜像文件中的符号表地址在0x30000000域;但我们要让其前4KB运行在0x00000000域处,这4KB代码只能通过基于当前PC指针的相对寻址!

一、关于编译连接脚本

连接脚本是用来描述输出文件的内存布局,也就是确定程序的运行地址。

gcc等编译器内置有缺省的连接脚本;但采用缺省脚本,则生成的目标代码需要操作系统才能加载运行。

而对于uboot这种需要在嵌入式系统上直接运行的程序,就不能使用编译器缺省脚本、而必须由我们编写连接脚本。

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

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

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

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

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

二、GNU对.lds文件形式的描述

arm-linux-ld -o uboot.elf -T uboot.lds *.o
arm-linux-objcopy -Obinary uboot.elf uboot.bin

二、解释uboot.lds

补充:arm程序的加载时域和运行时域

简单地说:程序的加载时域就是指程序被加载到什么地方、是SDRAM还是nor flash,运行时域是指程序执行时的地址。

一、镜像文件的组成

镜像文件包含加载时域和运行时域;

加载时域包含RO和RW段,运行时域包含RO、RW和ZI三个段。

其中RO和RW段的内容在加载时和运行时时一样的,但存储空间可能不同;而ZI段是运行时由初始化函数创建的。

二、代码、数据和变量在镜像文件中的位置

代码:一般是只读的,由编译器分配存储空间并放置镜像文件的RO段。

数据:这里的数据指常量、指针常量,它们属于只读数据、由编译器分配存储空间放在镜像文件的RO段。

变量:主要根据生存期划分;

1.全局变量和静态变量:由编译器分配存储空间,已初始化的放到RW段、未初始化的放置ZI段。

2.动态变量:局部变量,占用栈空间。

这篇关于uboot编译连接脚本文件uboot.lds的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812305

相关文章

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

SpringBoot连接Redis集群教程

《SpringBoot连接Redis集群教程》:本文主要介绍SpringBoot连接Redis集群教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 依赖2. 修改配置文件3. 创建RedisClusterConfig4. 测试总结1. 依赖 <de

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

java连接opcua的常见问题及解决方法

《java连接opcua的常见问题及解决方法》本文将使用EclipseMilo作为示例库,演示如何在Java中使用匿名、用户名密码以及证书加密三种方式连接到OPCUA服务器,若需要使用其他SDK,原理... 目录一、前言二、准备工作三、匿名方式连接3.1 匿名方式简介3.2 示例代码四、用户名密码方式连接4

MySQL 表的内外连接案例详解

《MySQL表的内外连接案例详解》本文给大家介绍MySQL表的内外连接,结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录表的内外连接(重点)内连接外连接表的内外连接(重点)内连接内连接实际上就是利用where子句对两种表形成的笛卡儿积进行筛选,我

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

电脑蓝牙连不上怎么办? 5 招教你轻松修复Mac蓝牙连接问题的技巧

《电脑蓝牙连不上怎么办?5招教你轻松修复Mac蓝牙连接问题的技巧》蓝牙连接问题是一些Mac用户经常遇到的常见问题之一,在本文章中,我们将提供一些有用的提示和技巧,帮助您解决可能出现的蓝牙连接问... 蓝牙作为一种流行的无线技术,已经成为我们连接各种设备的重要工具。在 MAC 上,你可以根据自己的需求,轻松地

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

《Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)》本文主要介绍了Golang分布式锁实现,采用Redis+Lua脚本确保原子性,持可重入和自动续期,用于防止超卖及重复下单,具有一定... 目录1 概念应用场景分布式锁必备特性2 思路分析宕机与过期防止误删keyLua保证原子性可重入锁自动