链接脚本文件入门介绍

news2024/11/25 0:49:31

本文框架

  • 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 = 8K
  MYRAM2 : 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.coloradmin.cn/o/1852749.html

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

相关文章

在 iPhone 上恢复已删除联系人的 5 种简便方法

想象一下&#xff1a;您正在 iPhone 上滚动并搜索要拨打的联系人&#xff0c;但却找不到任何结果。然后您想起昨晚您试图删除一个名字相似的联系人&#xff0c;但不知何故删除了错误的联系人。或者您的孩子错误地删除了一些联系人。这些情况足以让您感到迷茫。但别担心&#xf…

TI毫米波雷达可以用串口调试助理来获取原始数据吗?

摘要&#xff1a;本文介绍一下如何使用普通的串口调试助理来读取到AWR1843毫米波雷达的数据的。 使用的硬件如下图所示。 软件就是普通的串口助理&#xff0c;我用的是SSCOM&#xff0c;其他串口助理也是可以的&#xff0c;核心作用其实就是发送一行行的指令而已。 操作方法&am…

如何识别商业电子邮件诈骗

复制此链接到微信打开阅读全部已发布文章 不要关闭它标签&#xff01;我知道很少有词组比商业、电子邮件和妥协更无趣。 但这不是一篇无聊的文章&#xff1a;这是一篇关于电子邮件骗子的文章&#xff0c;根据联邦调查局的说法&#xff0c;他们每年通过诈骗人们赚取 260 亿美元…

EtherCAT数据包抓取(wireshark)

目录 1、twincat配置 2、选择正确的网卡 3、过滤条件示例 (1) 过滤逻辑读的数据帧 (2) 过滤邮箱等配置数据 (3) 抓取读EtherCAT状态的数据帧 1、twincat配置 勾选 Device2->Adapter->Promiscuous Mode&#xff0c;重新激活配置。 2、选择正确的网卡 3、过滤条件示…

用含成员函数的类,分别输入和输出各对象中的时间(时:分:秒)

编写程序&#xff1a; 运行结果&#xff1a; 注意&#xff1a; &#xff08;1&#xff09;在主函数中调用两个成员函数时&#xff0c;应指明对象名(t1,t2)。表示调用的是哪一个对象的成员函数。t1.display()和t2.display()虽然都是调用同一个 display函数&#xff0c;但…

修复 pprof ---node_exproter访问漏洞(go-pprof-leak)

前言&#xff1a; ** 在Go语言中&#xff0c;pprof和debug包是用来检测和避免goroutine泄漏&#xff0c;避免导致goroutine泄漏&#xff0c;进而消耗大量系统资源。不过对于安全而言确又存在一定风险&#xff0c;** 风险&#xff1a; 通过node_exporter web发现 190.168.46.1…

【C++】————类和对象(中)

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年6月22日 一、类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中什么都没有吗&#xff1f;并不是的&#xff0c;任何一个类在我们不写的情 况下&#x…

道路 Road(百练,POJ)

题目链接: 1724 -- ROADS (poj.org) 题目描述: 思路: 这题目乍一看&#xff0c;是一个含有2个标尺的单源最短路问题&#xff0c;挺难处理的。 既然没法直接用最短路处理&#xff0c;那我们就“记录信息”&#xff0c;将花费的时间也记录进dp数组&#xff0c;然后跑“状态最短…

2024年【化工自动化控制仪表】考试及化工自动化控制仪表新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 化工自动化控制仪表考试是安全生产模拟考试一点通总题库中生成的一套化工自动化控制仪表新版试题&#xff0c;安全生产模拟考试一点通上化工自动化控制仪表作业手机同步练习。2024年【化工自动化控制仪表】考试及化工…

基于vue3 + ant-design 使用阿里图标库iconfont.cn

对于使用 iconfont.cn 的用户&#xff0c;通过设置 createFromIconfontCN 方法参数对象中的 scriptUrl 字段&#xff0c; 即可轻松地使用已有项目中的图标。 组件封装 IconFont <template><IconFont :type"iconType" /> </template><script se…

记一道MO数学练习题

手玩发现&#xff0c; 要么是行共线&#xff0c; 也就是说&#xff08;1,1&#xff09;填1之后&#xff0c;&#xff08;1,4&#xff09;要填1&#xff0c;&#xff08;1,7&#xff09;要填1&#xff0c; 事实上&#xff0c;可以给&#xff08;1&#xff0c;x&#xff09;&a…

docker搭建mongo副本集

1、mongo集群分类 MongoDB集群有4种类型&#xff0c;分别是主从复制、副本集、分片集群和混合集群。 MongoDB的主从复制是指在一个MongoDB集群中&#xff0c;一个节点&#xff08;主节点&#xff09;将数据写入并同步到其他节点&#xff08;从节点&#xff09;。主从复制提供…

游戏高度可配置化(二)用“模型抽象”化解游戏策划和程序员的江湖恩怨

游戏高度可配置化&#xff08;二&#xff09;用“模型抽象”化解游戏策划和程序员的江湖恩怨 码客 卢益贵 ygluu 关键词&#xff1a;模型抽象、功能抽象、抽象工厂模式、游戏服务端引擎、高度可配置化、恩怨情仇、游戏策划、数据引擎、生产消费模型、订阅-通知模型 一、前言…

Go语言之基础入门

网站&#xff1a;http://hardyfish.top/ 免费书籍分享&#xff1a; 免费专栏分享&#xff1a; Go语言优势 语法简洁&#xff0c;相比其他语言更容易上手&#xff0c;开发效率更高&#xff1b; 自带垃圾回收&#xff08;GC&#xff09;&#xff0c;不用再手动申请释放内存&…

管综 之 逻辑

1.复言命题 1.1假言推理 1.命题模型识别:当题干中出现如果那么&#xff0c;只有才&#xff0c;当且仅当等典型关联词时此题考的是简单假言推理问题 2.三步解题法:1️⃣:画箭头 2️⃣:递否 3️⃣:找答案 口诀&#xff1a; [口诀1]充分条件前推后 [口诀2]逆否命题等价于原命题 […

第13关:存储过程1、第14关:存储过程2。(2021数据库期末一)

目录 首先需要学习和了解的知识 第13关&#xff1a;存储过程1 任务描述 答案 第14关&#xff1a;存储过程2 任务描述 答案 本篇博客的答案博主是学习别人得来的&#xff0c;敢于借鉴和学习哈哈&#xff01;&#xff01; 首先需要学习和了解的知识 了解什么是存储过程以及…

3D开发工具HOOPS为BIM应用提供支持:复杂大模型实现Web端轻量化!

在数字化转型的浪潮中&#xff0c;Tech Soft 3D以其HOOPS SDK工具包&#xff0c;为软件开发人员提供了强大的支持。这一工具包不仅支持Windows、Linux、OSX和移动平台等多样化的操作系统&#xff0c;还使得开发人员能够构建出庞大而复杂的建筑和BIM应用程序。HOOPS SDK的多格式…

现在的Android程序员为什么会感到焦虑?焦虑的源头在哪里?该怎么去缓解焦虑呢?——没有无中生有的贩卖焦虑,只有你的挣扎和不甘。

二、知识为何产生焦虑 先说两个世界&#xff0c;知识的世界和现实的世界。 知识的世界&#xff0c;由承载知识的那些载体组成&#xff0c;比如图书、音视频、报刊、自媒体等。 现实的世界&#xff0c;就是我们每天生活的、做出各种行为的世界。 学习的目的是什么呢&#xff1…

纯js开发在线截图生成器工具,思路和方法在这里

不谈使用转账付款交易截图的用途是什么&#xff0c;我这里只谈怎么通过代码来实现这个功能的思路&#xff0c;以及用到的技术。 最近有个客户找到探奇客需要定制一个截图生成的工具。开发后的效果是这样的 开发这个转账付款交易截图生成器用到了这些组件&#xff0c;这里就直接…

UsersGUI.java用户界面

完成效果图&#xff1a; 点击阅读按钮&#xff1a; 点击删除按钮&#xff1a; 点击新建按钮&#xff1a; Code /* This GUI application allows users to manage their diaries: ​ Read: Users can read existing diaries. Create: Users can create new diaries. Delete: Us…