链接脚本文件入门介绍

本文框架

  • 1. Why<为什么需要链接文件>
  • 2.What<是什么及组成>
    • 2.1 MEMORY介绍
    • 2.2 SECTIONS介绍
  • 3.How<链接文件应用>
    • 3.1 定义特定字段
    • 3.2 将变量定义在指定段
    • 3.3 将变量定义在不同的段
    • 3.4 将变量定义在指定地址
    • 3.5 将函数定义在指定段
    • 3.6 将函数定义在指定地址

本文将对链接脚本文件从Why/What/How角度进行入门介绍,辅助对链接脚本的初步上手,如您对汽车电子BSW部分Autosar全模块实战感兴趣,可参读热销专栏:AutoSar实战进阶系列导读,本文大纲如下:
在这里插入图片描述

1. Why<为什么需要链接文件>

在嵌入式软件编译过程中,需要经历预处理→编译→汇编→链接的过程,那在链接过程中,各个段在可执行文件如elf中的先后组装顺序也是一个需要考虑的问题,一个可执行程序肯定会有入口地址的,一般先执行的代码要放到前面。那么如何指定程序的链接地址和各个段的组装顺序呢?这就是链接脚本的作用了。

链接脚本对于嵌入式系统的程序开发尤其重要,为了系统的正常加载运行,开发者需要精确控制代码和数据在内存中的位置及顺序。

2.What<是什么及组成>

链接脚本由链接器(链接程序,如 GNU 的 ld)用于控制链接过程,最终生成可执行文件。链接脚本本质上是一个脚本文件,在这个脚本文件里,不仅规定了各个段的组装顺序、起始地址、位置对齐等信息,同时对输出的可执行文件格式、运行平台、入口地址等信息做了详细的描述。

链接文件主要包括两部分:MEMORY及SECTIONS

2.1 MEMORY介绍

MEMORY定义在链接脚本中用来描述目标系统的物理内存布局,它定义了一组内存区域,每个区域都有一个名称、起始地址、长度和属性。链接器会根据这些信息,将各个段放置在合适的内存区域中。

ORIGIN是一个关于内存区域地始地址的表达式。在内存分配执行之前,这个表达式必须被求值产生一个常数,这意味着你不可以使用任何节相关的符号。关键字’ORIGIN’可以被缩写为’org’或’o’(但是,不可以写为,比如‘ORG’)
LEN是一个关于内存区域长充(以字节为单位)的表达式。就像ORIGIN表达式,这个表达式在分配执行前也必须被求得为一个常数值。关键字’LENGTH’可以被简写为‘len’或’l’。

MEMORY
{Flash0          : org = 0x8000,          l = 2M
}

2.2 SECTIONS介绍

SECTIONS关键字用于的作用是定义输出文件中的段,并控制这些段的内容、布局和属性,包括output section(输出段)的相应input section(输入段)、LMA和VMA,是整个连接脚本中最为重要的部分。

LMA和VMA说明如下:每个output section都有一个LMA和一个VMA,LMA是其存储地址,而VMA是其运行时地址,例如将全局变量g_data所在数据段.data的LMA设为0x80000020(属于ROM地址),VMA设为0xD0004000(属于RAM地址),那么g_data的值将存储在ROM中的0x80000020处,而程序运行时,用到g_Data的程序会到RAM中的0xD0004000处寻找它。

如下介绍三种不同的case:

SECTIONS
{// case1:指定固定地址.my_data1 ( 0xD0004000 ) : AT ( 0x80000020 ){*(.myData1)}  ...// case2:仅指定内存空间,具体地址紧接着上一个output section的末尾地址。.my_data2 :{*(.myData2)} > ram AT> rom  ...//case3:对于代码段.text这种LMA与VMA相同的情况,可只定义VMA而不必指明LMA .my_data_start align(4) :>Flash0//这是一个自定义的section名称.my_data3:{*(.mydata3)// 这是一个通配符表达式,用于匹配所有以.sdata.ptavect开头的输入文件中的符号,并将它们添加到输出文件的.rosdata section中。} > Flash0 //表示将.rosdata section的内容放置在名为ASW0_Flash的存储器区域中。.my_data_end :>Flash0 链接段解析
}

3.How<链接文件应用>

在嵌入式软件实际开发中,会遇到一些场景需要将数据放入特定的字段,如对于XCP开发时,需要将标定量放到DS段中等,在后续介绍中会对一些常见场景及使用方法进行介绍。

3.1 定义特定字段

SECTIONS
{.rosdata:{*(.sdata.cal)} > Flash0 
}

3.2 将变量定义在指定段

可使用#pragma或attribute section两种方式:

/* case1 use #pragma */
#pragma section ".sdata.cal" awB
int testVar;
#pragma section/* case2 use attribute */
int testVar __attribute__((section(".sdata.cal" ,"f=awB")) );//a表示allocatable,w表示writable,B表示uninitialized(bss)

3.3 将变量定义在不同的段

当变量在section1存不下时,保存到section2,此时需要在两个段中都定义。

MEMORY
{...MYRAM1 : org = D0000000, len = 8KMYRAM2 : org = D0004000, len = 8K...
}SECTIONS
{.mydata1 :{(.mydata)} > MYRAM1.mydata2 :{(.mydata)} > MYRAM2
}

所有的数组都被放在.mydata段中,但是.mydata1和.mydata2分别被映射到MYRAM1和MYRAM2中,如果MYRAM1满了后,剩余的值将会置于MYRAM2中。

/* use #pragma */
#pragma section ".mydata" awB
int testVar;
#pragma section

3.4 将变量定义在指定地址

定义时,可将段的地址明确,在将地址放入段时地址就明确了。

SECTIONS
{.user_defined_bss 0x90001000 : ALIGN(4) FLAGS(aw){*(.sdata.cal)    } > CPU0_DLMU
}

3.5 将函数定义在指定段

__attribute__((section(".mydata"))) void myFunction() 
{// 函数实现
}

3.6 将函数定义在指定地址

只需要在section定义时加上地址即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/32531.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PyQt5】python可视化开发:PyQt5介绍,开发环境搭建快速入门

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

IDEA 中 Maven 报错 Cannot resolve xxx(全网试完,亲测有效的方法汇总)

问题&#xff1a; pom中已经添加相关依赖&#xff0c;maven刷新也没有用&#xff0c;依旧是疯狂报错。 可能原因&#xff1a; 在IDEA中的pom文件中添加了依赖&#xff0c;并且正确加载了相应依赖&#xff0c;pom文件没有报红&#xff0c;看起来像是把所有依赖库全部加载进来了&…

csp 2023 入门级题解(上)

csp 2023 入门级题解 上 第一题第二题第三题结构体联合体 第四题第五题第六题第7题第八题 第一题 unsigned是指无符号,用于int类型,是指自然数. const是定义常量,定义后的值不可修改. static是将系统栈中的变量放入内存,可以让其他程序调用 答案是c 第二题 答案d 第三题 s…

基于YOLOv5的PCB板缺陷检测系统的设计与实现

简介 随着电子设备的广泛应用,PCB(印刷电路板)作为其核心部件,其质量和可靠性至关重要。然而,PCB生产过程中常常会出现各种缺陷,如鼠咬伤、开路、短路、杂散、伪铜等。这些缺陷可能导致设备故障,甚至引发严重的安全问题。为了提高PCB检测的效率和准确性,我们基于YOLOv…

数组移除元素算法(以JS为例)

题目&#xff1a;LeeCode第27题 答案&#xff1a; 算法思想&#xff1a;双指针 这段代码实际上使用了一种简化版的双指针技术来实现元素的移除。这里的双指针技术并不是传统意义上的两个指针&#xff0c;而是一个索引k作为辅助指针&#xff0c;用来记录新数组&#xff08;或原…

Android 开发必备知识点及面试题汇总(Android+Java+算法+性能优化+四大组件……

**虚引用&#xff1a;**顾名思义&#xff0c;就是形同虚设&#xff0c;如果一个对象仅持有虚引用&#xff0c;那么它相当于没有引用&#xff0c;在任何时候都可能被垃圾回收器回收。 7.介绍垃圾回收机制 **标记回收法&#xff1a;**遍历对象图并且记录可到达的对象&#xff0c…

Jenkins定时构建自动化(一):Jenkins下载安装配置

目录 ​编辑 一、jdk下载安装 1. 已下载安装jdk 2. 未下载安装jdk 二、jenkins安装 1. .war包安装 三、获取IP地址 四、jenkins网页配置 一、jdk下载安装 1. 已下载安装jdk &#xff08;1&#xff09;查询jdk版本命令&#xff1a;java -version &#xff08;2&#xff09;…

idea2022激活

下载激活脚本 解压后&#xff0c;打开文件夹如下&#xff1a;ja-netfilter.jar 为激活补丁&#xff1a; 复制补丁所在的整个文件夹到硬盘某个位置 将 ja-netfilter补丁所在的整个文件夹移动到电脑上某个位置&#xff0c;我是放到了 D 盘下&#xff1a; &#xff08;路径中不…

Java面试题:内存管理、类加载机制、对象生命周期及性能优化

1. 说一下 JVM 的主要组成部分及其作用? JVM包含两个子系统和两个组件:Class loader(类装载)、Execution engine(执行引擎)、Runtime data area(运行时数据区)、Native Interface(本地接口)。 Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)装载class文…

Google Earth Engine(GEE)——ui.DateSlider时间进度条的设置

结果 函数: ui.DateSlider(start, end, value, period, <

基于ACO蚁群优化的城市最佳出行路径规划matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于ACO蚁群优化的城市最佳出行路径规划matlab仿真&#xff0c;可以修改城市个数&#xff0c;输出路径规划结果和ACO收敛曲线。 2.测试软件版本以及运行结果展示…

Google trend搜索关键词

Google trend地址&#xff1a;https://trends.google.com/trends/?geoUS&hlzh-CN 1、具体的操作步骤如下&#xff1a; 2、Google trend搜索页面如下&#xff1a;

2024-06-23 编译原理实验3——语义分析

文章目录 一、实验要求二、实验设计三、实验结果四、附完整代码 补录与分享本科实验&#xff0c;以示纪念。 一、实验要求 基于前面的实验&#xff0c;编写一个程序对使用 C—语言书写的源代码进行语义分析&#xff0c;输出语义分析中发现的错误&#xff08;涉及 17 种错误类…

mac电脑守护神CleanMyMac2024免费版本下载

&#x1f31f; 电脑的守护神&#xff1a;CleanMyMac&#x1f47e; 亲爱的数码控们&#xff0c;是不是每次看到电脑上满满的垃圾文件和缓慢的运行速度就感到头疼呢&#xff1f;别怕&#xff0c;今天我要来给你们安利一款神奇的小帮手——CleanMyMac&#xff01;它可是我们电脑的…

【驱动篇】龙芯LS2K0300之LED驱动

实验目的 点亮龙芯开发板上面的用户自定义LED灯&#xff0c;编写LED驱动以及测试用例验证实现效果&#xff0c;LED位于开发板左下方&#xff08;靠近USB口&#xff09;第二个 原理图 LED通过电阻上拉至电源P3V3&#xff0c;低电平时LED被点亮 设备树 打开arch/loongarch/boo…

【职场人】如何与同事有效沟通

在职场中&#xff0c;沟通如同桥梁&#xff0c;连接着每一位职场人士的心灵与智慧。有效的沟通不仅能让工作更加顺畅&#xff0c;还能让团队关系更加和谐。那么&#xff0c;如何与同事进行有效沟通呢&#xff1f;下面&#xff0c;我将结合个人经验和一些幽默的比喻&#xff0c;…

音频数据集1--LJSpeech单人语音

LJ Speech Dataset 版本号: 1.1 , 文件大小: 2.6GB 1.简介 1. 1 内容简介 LJS是一个语音数据集&#xff0c;包含 13,100 个音频片段&#xff0c;内容为Linda Johnson(欧美女性)朗读的 7 本书籍段落(非小说类)。每个片段都提供文本转录&#xff0c;片段长度从 1 到 10 秒不等&…

八大排序之希尔排序

一、概念及其介绍 希尔排序(Shell Sort)是插入排序的一种&#xff0c;它是针对直接插入排序算法的改进。 希尔排序又称缩小增量排序&#xff0c;因 DL.Shell 于 1959 年提出而得名。 它通过比较相距一定间隔的元素来进行&#xff0c;各趟比较所用的距离随着算法的进行而减小…

什么是微分和导数?

文章目录 设立问题微分特性指数特性线性特性常数特性 多项式微分导数 在机器学习领域&#xff0c;有多种解决最优化问题的方法&#xff0c;其中之一就是使用微分。 通过微分&#xff0c;可以得知函数在某个点的斜率&#xff0c;也可以了解函数在瞬间的变化。 设立问题 请想象一…

Tortoise 删除文件

1、右击需要删除的文件&#xff0c;选择Delete 2、提交