链接脚本学习笔记

news2024/11/29 3:58:23

IAR

一般步骤

链接器用于链接过程。它通常执行以下过程(请注意,某些步骤可以通过命令行选项或链接器配置文件中的指令关闭):

1.确定应用程序中要包含哪些模块。始终包含对象文件中提供的模块。仅当库文件中的模块为从包含的模块引用的全局符号提供定义时,才包含该模块。

2.选择要使用的标准库文件。选择基于所包含模块的属性。然后,这些库用于满足任何尚未定义的符号。

3.处理具有多个定义的符号。如果存在多个非弱定义,则会发出错误。否则,将选择其中一个定义(如果有非弱定义,则选择非弱定义),并抑制其他定义。弱定义通常用于内联函数和模板函数。
如果需要覆盖库模块中的一些非弱定义,则必须确保不包含库模块(通常通过为应用程序在该库模块中使用的所有符号提供替代定义)。

4.确定应用程序中包含的模块中的哪些部分/部分片段。仅包含应用程序实际需要的部分/部分片段。有几种方法可以确定需要哪些节/节片段,例如__root对象属性、#pragma required指令和keep-linker指令。如果是重复的部分,则仅包含一个。

5.在适当的情况下,安排初始化RAM中的初始化变量和代码。
initialize指令使链接器创建额外的部分,以启用从ROM到RAM的复制。将通过复制初始化的每个部分分为两个部分,一个用于ROM部分,另一个用于RAM部分。如果不使用手动初始化,链接器还会安排启动代码来执行初始化。

6.根据链接器配置文件中的节放置指令确定放置每个节的位置。
要通过复制初始化的部分在与放置指令的匹配中出现两次,一次用于ROM部分,一次为RAM部分,属性不同。在放置过程中,链接器还会添加任何所需的贴面,以使代码引用到达其目的地或切换CPU模式。

7.生成包含可执行映像和提供的任何调试信息的绝对文件。
可重定位输入文件中每个所需节的内容是使用其文件中提供的重定位信息和放置节时确定的地址来计算的。
如果未满足特定部分的某些要求,例如,如果放置导致PC相关跳转指令的目标地址超出该指令的范围,则此过程可能会导致一个或多个重新定位失败。

8.(可选)生成一个map文件,列出截面放置的结果
每个全局符号的地址,最后是每个模块和库的内存使用情况摘要。

下图显示了链接过程:
在这里插入图片描述

Placing code and data—the linker configuration file

典型的链接器配置文件包含以下定义:

  • 可用的可寻址存储器
  • Populated regions of those memories
  • How to treat input sections
  • Created sections
  • How to place sections into the available regions.

该文件由一系列声明性指令组成。这意味着链接过程将同时受所有指令的控制。要将相同的源代码用于不同的派生代码,只需使用适当的配置文件重新生成代码。

配置文件的一个简单示例

在这里插入图片描述
在这里插入图片描述

此配置文件定义了一个可寻址内存Mem,最大内存为4 GB。此外,它在Mem中定义了ROM区域和RAM区域,即ROM和RAM。每个区域的大小为64 KB。

然后,该文件创建一个名为STACK的空块,其大小为4K字节,应用程序堆栈将驻留在其中。创建块是一种基本方法,您可以使用它来详细控制位置、大小等。
它可以用于对节进行分组,但也可以像本例中那样,指定内存区域的大小和位置。

接下来,该文件定义了如何处理变量、读/写类型(readwrite)部分的初始化。
在本例中,初始化器放置在ROM中,并在应用程序启动时复制到RAM区域。默认情况下,ILINK可以压缩初始化器,如果这看起来是有利的。

配置文件的最后一部分处理所有节在可用区域中的实际位置。首先,定义为驻留在只读(只读)部分.cstartup中的启动代码被放置在ROM区域的开头,即地址0x10000。

注意:{}中的部分被称为节选择,它选择了应该应用指令的节。然后,其余的只读节被放置在ROM区域中。

注意:节选择{readonly section.cstartup}优先于更通用的节选择{readonly}。

最后,读/写(读写)部分和STACK块被放置在RAM区域中。
本图简要介绍了应用程序如何放置在内存中:
在这里插入图片描述
除了这些标准指令外,配置文件还可以包含定义如何执行以下操作的指令:
在这里插入图片描述

Initialization at system startup

待续

Linking your application

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

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

相关文章

智慧楼宇系统:商办楼宇运营方的不二之选

现在,许多商办楼宇运营方都倾向于选择专业的商办楼宇管理系统来完成日常运营管理,从而实现楼宇的高效运作。 那么问题来了,商办楼宇运营者该如何选购一个合适的楼宇管理系统?在选择系统之前,必须要清楚系统能解决哪些…

NODE => CORS跨域资源共享学习

1.CORS跨域资源共享 cors是Express的一个第三方中间件。通过安装和配置cors中间件,可以很方便地解决跨域问题 运行npm install cors 安装中间件使用const cors require(‘cors’) 导入中间件在路由之前调用 app.use(cors()&#…

Java · 常量介绍 · 变量类型转换 · 理解数值提升 · int 和 Stirng 之间的相互转换

书接上回 Java 变量介绍 我们继续学习以下内容. 四、常量字面值常量final 关键字修饰的常量五、理解类型转换int 和 long/double 相互赋值int 和 boolean 相互赋值int 字面值常量给 byte 赋值强制类型转换类型转换小结六、理解数值提升int 和 long 混合运算byte 和 byte 的运算…

大数据未来会如何发展

大数据应用的重要性,自全国提出“数据中国”的概念以来,我们周围默默地在发挥作用的大数据逐渐深入人们的心中,大数据的应用也越来越广泛,具体到金融、汽车、餐饮、电信、能源、体育和娱乐等领域 为什么大数据技术那么火&#xf…

机器学习之决策树原理详解、公式推导(手推)、面试问题、简单实例(python实现,sklearn调包)

目录1. 决策树原理1.1. 特性1.2. 思路1.3. 概念决策树概念信息论2. 公式推导2.1. 构造决策树2.1.1. ID3理论示例缺点2.1.2. C4.5理论示例缺点2.1.3. CART示例对比分析2.2. 剪枝3. 实例3.1. 数据集3.2. ID33.3. C4.53.4. CART3.5. sklearn实现4. 几个注意点(面试问题)5. 运行&am…

高性能MySQL -- 查询性能优化

一般来说一个好的程序:查询优化,索引优化,库表结构要同时进行优化。今天我们来讲一下查询优化。 我们需要对MySQL的架构有基本认知,所以这里贴一张图大家看看: 图片来自于《小林coding》 为什么从查询会慢&#xff1…

点云深度学习系列博客(四): 注意力机制原理概述

目录 1. 注意力机制由来 2. Nadaraya-Watson核回归 3. 多头注意力与自注意力 4. Transformer模型 Reference 随着Transformer模型在NLP,CV甚至CG领域的流行,注意力机制(Attention Mechanism)被越来越多的学者所注意,将…

九、Linux文件 - fopen函数和fclose函数讲解

目录 1.fopen函数 2.fclose函数 3.fopen函数和fclose实战 1.fopen函数 fopen fwrite fread fclose ...属于标准C库 include <stdio.h> standard io lib open close write read 属于Linux系统调用 可移植型&#xff1a;fopen > open&#xff08;open函数只在嵌入…

ES6的代理Proxy和反射Reflect的使用

一、Proxy使用 作用&#xff1a;Proxy是ES6为了操作对象而引入的API&#xff0c;不直接作用于对象&#xff0c;而是通过类似媒介的方式进行对象的操作使用 /*** target&#xff1a;需要proxy处理的对象* handler&#xff1a;对对象进行处理的方法 */ let proxy new Proxy(ta…

ARM uboot源码分析2-启动第一阶段

一、start.S 解析5 注释的中文含义&#xff1a; 当我们已经在 RAM 中运行时&#xff0c;我们不需要重新定位 U-Boot。实际上&#xff0c;在 U-Boot 在 RAM 中运行之前&#xff0c;必须配置内存控制器。 1、判断当前代码执行位置 (1) lowlevel_init.S 的 110-115 行。 (2) 这几…

5年经验之谈:月薪3000到30000,测试工程师的变“行”记!

自我介绍下&#xff0c;我是一名转IT测试人&#xff0c;我的专业是化学&#xff0c;去化工厂实习才发现这专业的坑人之处&#xff0c;化学试剂害人不浅&#xff0c;有毒&#xff0c;易燃易爆&#xff0c;实验室经常用丙酮&#xff0c;甲醇&#xff0c;四氯化碳&#xff0c;接触…

ESP32 Arduino(十二)lvgl移植使用

一、简介LVGL全程LittleVGL&#xff0c;是一个轻量化的&#xff0c;开源的&#xff0c;用于嵌入式GUI设计的图形库。并且配合LVGL模拟器&#xff0c;可以在电脑对界面进行编辑显示&#xff0c;测试通过后再移植进嵌入式设备中&#xff0c;实现高效的项目开发。SquareLine Studi…

RMI攻击中的ServerClient相互攻击反制

前言 前文中&#xff0c;我们分析了攻击Registry的两种方式&#xff0c;这里我们接着前面的内容&#xff0c;分析Server和Client的相互攻击方式。 Attacked Server Attacked By Client 首先我们搭建个示例&#xff0c;这里直接注册端和服务端放置在一起。 package pers.rm…

JS 实现抛物线动画案例

相信大家都有浏览过&#xff0c;很多购物网站购物车的添加商品动画&#xff0c;今天&#xff0c;我们就手写一个简单的抛物线动画&#xff0c;先上案例&#xff1a; 一、绘制页面 我们这里简单实现&#xff0c;一个按钮&#xff0c;一个购物车图标&#xff0c;样式这里直接跳过…

GNN图神经网络原理解析

一、GNN基本概念 1. 图的基本组成 图神经网络的核心就是进行图模型搭建&#xff0c;图是由点和边组成的。在计算机处理时&#xff0c;通常将数据以向量的形式进行存储。因此&#xff0c;在存储图时&#xff0c;就会有点的向量&#xff0c;点与点之间边的向量&#xff0c;全局…

Acwing---1235. 付账问题

付账问题1.题目2.基本思想3.代码实现1.题目 几个人一起出去吃饭是常有的事。 但在结帐的时候&#xff0c;常常会出现一些争执。 现在有 nnn个人出去吃饭&#xff0c;他们总共消费了 SSS元。 其中第 iii 个人带了 aiaiai元。 幸运的是&#xff0c;所有人带的钱的总数是足够…

vue解决跨域问题-反向代理

浏览器有同源策略&#xff0c;限制同协议、同域名、同端口&#xff0c;只要有一项不一致&#xff0c;就是跨域。&#xff08;不同源则跨域&#xff09; 解决方案&#xff1a; 后端 、cors 、 jsonp、 反向代理 同源下&#xff1a;浏览器向服务器请求数据&#xff0c;服务器响应…

jenkins +docker+python接口自动化之docker下安装jenkins(一)

jenkins dockerpython接口自动化之docker下安装jenkins&#xff08;一&#xff09; 目录&#xff1a;导读 1、下载jenkins 2、启动jenkins 3、访问jenkins 4.浏览器直接访问http://ip/:8080 5.然后粘贴到输入框中,之后新手入门中先安装默认的插件即可&#xff0c;完成后出…

俄罗斯方块游戏代码

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽…

图表控件LightningChart .NET再破世界纪录,支持实时可视化 1 万亿个数据点

LightningChart.NET SDK 是一款高性能数据可视化插件工具&#xff0c;由数据可视化软件组件和工具类组成&#xff0c;可支持基于 Windows 的用户界面框架&#xff08;Windows Presentation Foundation&#xff09;、Windows 通用应用平台&#xff08;Universal Windows Platfor…