当前位置: 首页 > news >正文

【裸机开发】链接脚本(.lds文件)的基本语法

目录

一、什么是链接脚本?

二、链接脚本的基本语法格式

1、常用命令

2、内置变量

三、链接脚本的简单案例


一、什么是链接脚本?

一段程序的编译需要经历四个阶段(预处理—编译—汇编—链接),而链接脚本管理的就是其中的“链接”阶段。一段程序往往包含了变量、常量、数据(代码逻辑),他们属于不同的段:

  • .bss段:一个全局变量,没有被初始化 或者 被初始化为0。
  • .data:一个全局变量,非const类型,已被初始化(初始值必须是非0值)
  • .rodata段:read only data,如字符串常量、const修饰的变量都会被保存到该段
  • .text段:程序代码段,更进一步讲是存放处理器的机器指令。函数代码逻辑都会保存到该段

链接脚本决定了一个可执行程序的各个段的存储位置,相当于要给程序中的数据和变量进行分类,并确定每一类的存放位置

注意:实际涉及的段远不止这四个,这里只是列举了我们所熟知的段

二、链接脚本的基本语法格式

1、常用命令

命令说明举例
ENTRY(symbol)

这里的symbol指的是符号表中的符号。汇编阶段会生成符号表,符号表中的符号包括静态变量、全局变量、函数名等。

这是将某一个符号symbol的值设为入口地址(进程执行的第一条用户空间指令就会从此处开始执行)

ENTRY(_start)
OUTPUT_ARCH设置输出文件的目标平台架构OUTPUT_ARCH(arm)
SECTIONS告诉链接器如何把输入文件映射到内存指定位置(即设置各个段的位置)

SECTIONS

{

    ...

}

更多命令参考:lds文件命令

2、内置变量

.bss:表示bss段

.data:表示data段

.rodata:表示rodata段

.text:表示text段

. :定位器(暂不解释,下面示例说明的时候会更有体会)

三、链接脚本的简单案例

以下面这个链接脚本为例:

1、第 2 行

. 表示定位器,你可以理解为一个指针,此时指针指向的是 0x87800000的位置。

2、第 3 - 5 行

.text 开头,说明这里要设置的是 text 段相关的内容了。每一个文件都可能存在 .text段、.data 段 相关的内容,* 是通配符,表示所有文件;*(.text) 表示每个文件与 .text 段相关的内容。

这里想表达的意思是,把 obj 下的 start.o 和 其他所有输入文件与 .text 段相关的内容统一保存到DDR的 .text 段。

3、第 8 行

如果这里没有 ALIGN(4),根据.text 的理解就是,所有输入文件和 .rodata 段相关的内容都保存到DDR的 .rodata 段。

ALIGN(4) 的作用是地址对齐,即DDR 的 .rodata 段的起始地址必须是 4 的整数倍。如果没有ALIGN(4),rodata段是紧跟在 .text 的后面的。(假设 .text 段的大小是 0x1001)

.rodata :
{*(.rodata)
}

如果加了 ALIGN(4),此时 .rodata 的起始地址必须是 4 的整数倍。这么做的目的是提升内存访问效率,内存在访问该段的时候,没必要每个地址都去查,只要查 4 的整数倍的地址即可。

// 也可以是 ALIGN(8)
.rodata ALIGN(4) :
{*(.rodata)
}

4、第 9 行

参考第 8 行的解析

5、第 10 - 12 行

__bss_start 和 __bss_end 并非内置变量,而是自定义符号,以便用于保存 bss 段的起始位置和结束地址。前面提到 . 表示定位器,即便我们中间没有去手动管理,它也会自动跟随我们的操作进行移动。第 11 行可以参考第 8 行的解析。

问:为什么需要保存 .bss 段的起始位置和结束位置?

答:

        .bss 段是保存了被定义但是没有被初始化的变量,我们需要手动对 .bss 段的变量清零,为此我们就需要知道 .bss 段的起始位置和结束地址,以便于之后在 C文件或者汇编文件中直接引用

相关文章:

【裸机开发】链接脚本(.lds文件)的基本语法

目录 一、什么是链接脚本? 二、链接脚本的基本语法格式 1、常用命令 2、内置变量 三、链接脚本的简单案例 一、什么是链接脚本? 一段程序的编译需要经历四个阶段(预处理—编译—汇编—链接),而链接脚本管理的就是…...

Java 进阶 -- 集合(三)

4、实现 实现是用于存储集合的数据对象,它实现了接口部分中描述的接口。本课描述了以下类型的实现: 通用实现是最常用的实现,是为日常使用而设计的。它们在标题为“通用实现”的表格中进行了总结。特殊目的实现是为在特殊情况下使用而设计的&#xff0…...

【华为OD机试真题 C语言】5、TLV解析 | 机试真题+思路参考+代码解析

文章目录 一、题目🎃题目描述🎃输入输出🎃样例1 二、思路参考三、代码参考🏆C语言 作者:KJ.JK 🍂个人博客首页: KJ.JK 🍂专栏介绍: 华为OD机试真题汇总,定期…...

(七)CSharp-刘铁锰版-事件

一、初步了解事件 定义:单词 Event ,译为“事件” 《牛津词典》中的解释是“a thing that happens,especially something important”通顺的解释就是“能够发生的什么事情” 角色: 使对象或类具备通知能力的成员 (中译&#x…...

【ROS】郭老二博文之:ROS目录

1、ROS2 【ROS】Ubuntu22.04安装ROS2(Humble Hawksbill) 【ROS】ROS2命令行工具详解 【ROS】ROS2中的概念和名词解释 【ROS】ROS2编程示例:话题订阅-发布-C版 【ROS】ROS2编程示例:服务和客户端-C版 【ROS】ROS2编程示例&#xf…...

Android应用程序进程的启动过程

Android应用程序进程的启动过程 导语 到这篇文章为止,我们已经简要地了解过了Android系统的启动流程了,其中比较重要的内容有Zygote进程的启动和SystemService以及Launcher的启动,接下来我们将要学习的是Android应用程序的启动过程&#xff…...

【2】Midjourney注册

随着AI技术的问世,2023年可以说是AI爆炸性成长的一年,近期最广为人知的AI服务除了chatgpt外,就是从去年五月就已经问世的AI绘画工具mid journey了。 ▲几个AI工具也代表了人工智能的热门阶段 只要输入一段文字,AI就会根据语意计算…...

第六十八天学习记录:高等数学:导数(宋浩板书)

导数是微积分中的一个概念,描述了函数在某一个点上的变化率。具体地说,函数 f ( x ) f(x) f(x)在 x a xa xa处的导数为 f ′ ( a ) f(a) f′(a),表示当 x x x在 a a a处发生微小的变化 Δ x \Delta x Δx时, f ( x ) f(x) f(x)对…...

unreal 5 实现角色拾取功能

要实现角色拾取功能,我们需要实现蓝图接口功能,蓝图接口主要提供的是蓝图和蓝图之间可以通信,接下来,跟着教程,实现一下角色的拾取功能。 首先,我们要实现一个就是可视区的物品在朝向它的时候,会…...

chatgpt赋能python:如何使用Python升序排列一个列表?

如何使用Python升序排列一个列表? 在Python编程中,我们经常需要对列表进行排序。列表排序是一种常见的操作,可以帮助我们对数据进行分析和管理。在这篇文章中,我们将学习如何使用Python对一个列表进行升序排列。 什么是升序排列…...

Lecture 20 Topic Modelling

目录 Topic ModellingA Brief History of Topic ModelsLDAEvaluationConclusion Topic Modelling makeingsense of text English Wikipedia: 6M articlesTwitter: 500M tweets per dayNew York Times: 15M articlesarXiv: 1M articlesWhat can we do if we want to learn somet…...

ThreadPoolExecutor线程池

文章目录 一、ThreadPool线程池状态二、ThreadPoolExecutor构造方法三、Executors3.1 固定大小线程池3.2 带缓冲线程池3.3 单线程线程池 四、ThreadPoolExecutor4.1 execute(Runnable task)方法使用4.2 submit()方法4.3 invokeAll()4.4 invokeAny()4.5 shutdown()4.6 shutdownN…...

chatgpt赋能python:Python实践:如何升级pip

Python实践:如何升级pip Python作为一门高效的脚本语言,被广泛应用于数据分析、人工智能、Web开发等领域。而pip则是Python的包管理工具,是开发Python应用的必备工具。但是pip在使用过程中,有时候会出现版本不兼容或者出现漏洞等…...

【JavaEE进阶】mybatis

目录: 一、Mybatis是什么 三个映射关系如下图: 二、mybatis的使用(前置工作简单案例) 第一步:导入MAVEN依赖 第二步: 在spring项目当中新建数据源 第三步:新建一个实体类,是和…...

Redis的大key

什么是 redis 的大 key redis 的大 key 不是指存储在 redis 中的某个 key 的大小超过一定的阈值,而是该 key 所对应的 value 过大对于 string 类型来说,一般情况下超过 10KB 则认为是大 key;对于set、zset、hash 等类型来说,一般…...

MMPretrain

title: mmpretrain实战 date: 2023-06-07 16:04:01 tags: [image classification,mmlab] mmpretrain实战 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccTl9bOl-1686129437336)(null)] 主要讲解了安装,还有使用教程.安装教程直接参考官网.下面讲…...

栈和队列(数据结构刷题)[一]-python

文章目录 前言一、原理介绍二、用栈实现队列1.操作2.思路 三、关于面试考察栈里面的元素在内存中是连续分布的么? 前言 提到栈和队列,大家可能对它们的了解只停留在表面,再深入一点,好像知道又好像不知道的感觉。本文我将从底层实…...

【备战秋招】JAVA集合

集合 前言 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象 的操作,就要 对对象进行存储。 另一方面,使用Array存储对象方面具有一些弊端,而Java 集合就像一种容器,可以动态地把多…...

setState详解

this. setState( [partialState], [callback]) 1.[partialState] :支持部分状态更改 this, setState({ x:100 //不论总共有多少状态,我们只修改了x,其余的状态不动 });callback :在状态更改/视图更新完毕后触发执行,也可以说只要执行了setS…...

Qt5.12.6配置Android Arm开发环境(windows)

1. 安装jdk1.8 2.安装Android Studio 并安装 SDK 与NDK SDK Tools 选择 26.0.3 SDK Platform 选择 Android SDK Platform 26 NDK选择19版本 安卓ARM环境配置成功如下: JDK1.8 , SDK 26 , NDK 19 在安装QT时要选择 ARMv7(32位CPU)与ARM64-v8a(64位CPU) 选择支持android平台…...

七、进程程序替换

文章目录 一、进程程序替换(一)概念(二)为什么程序替换(三)程序替换的原理(四)如何进行程序替换1. execl2. 引入进程创建——子进程执行程序替换,会不会影响父进程呢? &…...

C++核心编程——详解运算符重载

文章目录&#x1f4ac; 一.运算符重载基础知识①基本概念②运算符重载的规则③运算符重载形式④运算符重载建议 二.常用运算符重载①左移(<<)和右移(>>)运算符重载1️⃣重载后函数参数是什么&#xff1f;2️⃣重载的函数返回类型是什么&#xff1f;3️⃣重载为哪种…...

2023年前端面试汇总-CSS

1. CSS基础 1.1. CSS选择器及其优先级 对于选择器的优先级&#xff1a; 1. 标签选择器、伪元素选择器&#xff1a;1&#xff1b; 2. 类选择器、伪类选择器、属性选择器&#xff1a;10&#xff1b; 3. id 选择器&#xff1a;100&#xff1b; 4. 内联样式&#xff1a;1000&a…...

Java调用Pytorch实现以图搜图(附源码)

Java调用Pytorch实现以图搜图 设计技术栈&#xff1a; 1、ElasticSearch环境&#xff1b; 2、Python运行环境&#xff08;如果事先没有pytorch模型时&#xff0c;可以用python脚本创建模型&#xff09;&#xff1b; 1、运行效果 2、创建模型&#xff08;有则可以跳过&#xf…...

【EasyX】实时时钟

目录 实时时钟1. 绘制静态秒针2. 秒针的转动3. 根据实际时间转动4. 添加时针和分针5. 添加表盘刻度 实时时钟 本博客介绍利用EasyX实现一个实时钟表的小程序&#xff0c;同时学习时间函数的使用。 本文源码可从github获取 1. 绘制静态秒针 第一步定义钟表的中心坐标center&a…...

基于XC7Z100的PCIe采集卡(GMSL FMC采集卡)

GMSL 图像采集卡 特性 ● PCIe Gen2.0 X8 总线&#xff1b; ● 支持V4L2调用&#xff1b; ● 1路CAN接口&#xff1b; ● 6路/12路 GMSL1/2摄像头输入&#xff0c;最高可达8MP&#xff1b; ● 2路可定义相机同步触发输入/输出&#xff1b; 优势 ● 采用PCIe主卡与FMC子…...

Kibana:使用 Kibana 自带数据进行可视化(一)

在今天的练习中&#xff0c;我们将使用 Kibana 自带的数据来进行一些可视化的展示。希望对刚开始使用 Kibana 的用户有所帮助。 前提条件 如果你还没有安装好自己的 Elastic Stack&#xff0c;你可以参考如下的视频来开启 Elastic Stack 并进行下面的练习。你可以开通阿里云检…...

MySQL数据库基础 07

第七章 单行函数 1. 函数的理解1.1 什么是函数1.2 不同DBMS函数的差异1.3 MySQL的内置函数及分类 2. 数值函数2.1 基本函数2.2 角度与弧度互换函数2.3 三角函数2.4 指数与对数2.5 进制间的转换 3. 字符串函数4. 日期和时间函数4.1 获取日期、时间 4.2 日期与时间戳的转换 4.3 获…...

JVM | JVM垃圾回收

JVM | JVM垃圾回收 1、堆空间的基本结构2、内存分配和回收原则2.1、对象优先在 Eden 区分配2.2、大对象直接进入老年代2.3、长期存活的对象将进入老年代2.4、主要进行 gc 的区域2.5、空间分配担保3、死亡对象判断方法3.1、引用计数法3.2、可达性分析算法3.3、引用类型总结3.4、…...

avive零头撸矿

Avive 是一个透明的、自下而上替代自上而下的多元网络&#xff0c;旨在克服当前生态系统的局限性&#xff0c;实现去中心化社会。 aVive&#xff1a;一个基于 SBT 和市场的 deSoc&#xff0c;它使 dapps 能够与分散的位置 oracle 和 SBT 关系进行互操作。您的主权社交网络元宇宙…...

wordpress 插件 浮动小人/企业培训机构

一&#xff1a;重启xenserver&#xff0c;待启动界面进入到boot时&#xff0c;键入menu.c32二&#xff1a;待出现以下界面是&#xff0c;在5秒内按下tab键&#xff1a;三&#xff1a;按下tab建后&#xff0c;出现启动参数&#xff0c;然后加入single参数&#xff1a;回车&#…...

重庆做营销网站建设/今日重大新闻头条十条

前言&#xff1a;貌似时隔上一篇博客已经过了很久了&#xff0c;这里再写一下关于vi&#xff08;vim&#xff0c;gvim&#xff09;的配置 一、vi编辑器的配置文件及目录需要提到的是&#xff0c;vi编辑器的配置文件主要有两个地方1. &#xff5e;/.vimrc #这里以.开头说明…...

免费创办网站/html网页制作app

大小&#xff1a;55.24MB语言&#xff1a;简体分类&#xff1a; 网页辅助版本&#xff1a; 电脑版立即下载 查看详情本文将给大家介绍如何使用八爪鱼采集器采集分页列表页面上的信息&#xff0c;并附带给大家讲一下ajax延时设置。目的是让大家了解怎么创建循环翻页并能正常采集…...

php做动态网站/seo搜索引擎优化技术

SQL Server 数据库启动过程&#xff0c;以及启动不起来的各种问题的分析及解决技巧参考文章&#xff1a; &#xff08;1&#xff09;SQL Server 数据库启动过程&#xff0c;以及启动不起来的各种问题的分析及解决技巧 &#xff08;2&#xff09;https://www.cnblogs.com/VicL…...

wordpress备份百度云/有哪些网站可以免费发布广告

便快是一种通便药&#xff0c;主要适用于治疗便秘。 它的主要成分是通便剂&#xff0c;如泻药或植物性通便剂&#xff0c;如海藻糖或鼠尾草碱。此外&#xff0c;便快中还可能含有其他成分&#xff0c;如阿斯匹林、消炎药或抗生素&#xff0c;以帮助治疗其他相关的肠道问题。请注…...

建站abc口碑/厦门网站seo外包

1.为什么要说动画&#xff1f;动画的适用是Android开发常用的知识种类繁多&#xff0c;适用复杂&#xff0c;很多实现需要自定义动画2.目前Android中有多少种动画&#xff1f;视图动画(View 动画)属性动画揭露动画(Reveal Effect)转场动画 & 共享元素(Activity 切换动画)矢…...