R_AARCH64_ADR_PREL_PG_HI21问题说明

目录

问题现象:

问题原因

问题机理


问题现象:

客户现场加载out文件出现如下问题:

打印“Relocation of type ‘R_AARCH64_ADR_PREL_PG_HI22…..’”,明确是ARDP指令引起的问题

问题原因

ARDP的寻址范围是±4GB范围,加载的位置已经超过这个位置范围,便会报如

问题机理

ARDP指令说明:

ADRP指令使用一个21位的立即数(immediate)来指定偏移量,这个偏移量是以4KB页面大小为单位计算的。因此,ADRP指令可以表示的偏移范围是:

超出范围的处理

        如果目标地址超出了±4GB范围,编译器将无法使用ADRP指令生成有效的偏移量。在这种情况下,编译阶段会产生错误。具体错误信息可能因编译器和工具链而异,但通常会出现类似于“out of range”或“cannot generate relocation”之类的错误信息。

        链接时错误:如果链接器在处理重定位时发现符号地址超出了 ADRP 能够表示的范围,它可能会报错。这种情况下,链接器可能会报告一个错误,提示重定位类型 R_AARCH64_ADR_PREL_PG_HI21 无法应用,因为目标地址超出了 ADRP 指令能够访问的范围。

        运行时错误:如果链接器没有检测到这个问题,或者在编译时使用了某些特殊的选项来绕过检查,那么在运行时,程序可能会尝试执行一个超出范围的地址访问。这将导致未定义行为,可能表现为程序崩溃或产生错误消息。

常见错误信息

在使用ADRP指令加载超出±4GB范围的地址时,常见的编译器错误信息包括:

“relocation truncated to fit”

“cannot generate relocation”

“immediate offset out of range”

这些错误表明目标地址超出了ADRP指令能够处理的范围,编译器无法生成有效的机器码。

解决方案

        在out文件编译的时候添加-mcmodel=large参数。

        使用 -mcmodel=large 时指令生成的变化

        在大内存模型下,编译器会选择能够处理更大地址空间的指令来确保正确访问数据。例如:

        在小内存模型下,编译器可能会生成如下代码:

ADRP X0, label
ADD  X0, X0, :lo12:label

        在大内存模型下,编译器可能会生成如下代码:

LDR  X0, =label

        在大内存模型下,使用LDR指令可以直接从内存中加载绝对地址,而不受±2GB的限制。这是因为在-mcmodel=large模式下,编译器假定需要访问的地址可能超出ADRP指令的范围。

说明(LDR和ADRP区别)

        在ARMv8架构中,ADRP 和 LDR 指令用于不同的目的和场景,尽管它们都与内存地址操作有关。以下是它们的主要区别:

ADRP 指令

        ADRP 指令是“Add with Relocation Page”的缩写,用于生成一个页面对齐的地址。它将当前的PC(程序计数器)与一个相对偏移相加,并将结果存储在目标寄存器中。主要用于生成基地址,在加载较大的数据或访问静态变量时特别有用。

  1. 语法: ADRP Xd, label
  2. 功能: 将标签(label)的页基地址加载到寄存器 Xd 中。标签必须在同一页面(通常为4KB)或相邻页面中。
  3. 用途: 常用于PIC(位置无关代码)和地址计算,如访问全局变量或静态数据。

例如:

ADRP X0, label  ; 将label的页基地址加载到X0

LDR 指令

        LDR 指令是“Load Register”的缩写,用于从内存中加载数据到寄存器中。LDR 可以直接加载数据或通过基址和偏移量来访问内存。

  1. 语法: LDR Xt, [Xn, #offset]
  2. 功能: 从地址 [Xn + offset] 处加载数据到寄存器 Xt 中。
  3. 用途: 直接访问内存中的数据,用于加载全局变量、数组元素或从内存中读取任意数据。

例如:

LDR X1, [X0, #offset]  ; 从X0 + offset处加载数据到X1

示例说明

        结合 ADRP 和 LDR 指令,我们可以看到一个完整的地址加载过程。例如,加载一个全局变量的地址:

ADRP X0, label       ; 加载label所在页的页基地址到X0

LDR X1, [X0, #offset] ; 从X0 + offset处加载实际数据到X1

        在这个例子中,ADRP 用于生成一个接近目标地址的基址(页对齐的基址),然后 LDR 用于加载该地址的实际数据。

总结

        ADRP 用于生成页基地址,特别适用于需要生成基址的情况。

        LDR 用于从内存加载数据,直接与内存地址打交道。(因虚拟地址需MMU配置完成才能使用

        两者结合使用时,能够有效地访问大数据或静态变量,在编写高效和位置无关代码时尤为重要。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat概述及部署

目录 一、Tomcat概述 1.Tomcat的简介 2.Tomcat 核心的三个组件 3.应用场景 4.Tomcat 请求过程 二、部署安装Tomcat 三、Tomcat 虚拟主机配置 四、Tomcat多实例部署 一、Tomcat概述 1.Tomcat的简介 Tomcat 是 Java 语言开发的,Tomcat 服务器是一个免费的开…

经验分享,超声波车位引导系统和视频车位引导系统有哪些区别

随着城市化进程的加速和汽车保有量的持续增长,停车难已成为城市交通管理的一大挑战。车位引导系统作为解决这一问题的有效工具,其重要性日益凸显。它不仅能够提升停车场的运营效率,还能显著改善驾驶者的停车体验。目前市场上主要有两种车位引…

颠沛流离学二叉树(完结撒花篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

mac M1下安装PySide2

在M1下装不了PySide2, 是因为PySide2没有arm架构的包 1 先在M1上装qt5 安装qt主要是为了能用里面的Desinger, uic, rcc brew install qt5 我装完的路径在/opt/homebrew/opt/qt5 其中Designer就是用来设计界面的 rcc用resource compiler, 编绎rc资源文件的, 生成对应的py文件…

使用pexpect检查SSH上的文件是否存在

使用 pexpect 模块可以在 Python 中执行命令并检查其输出。你可以使用 ssh 命令连接到远程服务器,并执行 ls 命令检查文件是否存在。下面我就列举几个我经常遇到的几个错误并做个详细的解决方案。 1、问题背景 用户需要编写一个 Python 脚本,以检查一个…

编制教师违约金一般是多少钱

老师们,你们在签订合同时,对合同中提到的违约金条款感到疑惑?那么,编制教师的违约金一般是多少呢?可能很多老师在签订合同时都没有一个明确的答案。 违约金的设定是为了保障双方的权益,当一方违反合同约定时…

有极性电容器的引脚极性怎么判别?

由于有极性电容器有正、负之分,在电路中又不能乱接,所以在使用有极性电容器前需要先判别出正、负极。有极性电容器的正、负极判别方法如图2—9~图2—11所示。 方法一:对于未使用过的新电容,可以根据引脚长短来判别。引…

【阿里前端面试题】聊聊前端性能优化的方案,解决过什么样的性能问题?

大家好,我是“寻找DX3906”。每天进步一点。日积月累,有朝一日定会厚积薄发! 前言: 前面已经和大家分享了4篇面试题: 《【阿里前端面试题】浏览器的加载渲染过程》 《【阿里前端面试题】客户端和服务器交互&#xff…

VUE3 学习笔记(12):对比Vuex与Pinia状态管理的基本理解

在组件传值中,当嵌套关系越来越复杂的时候必然会将混乱,是否可以把一些值存在一个公共位置,无须传值直接调用呢?VUEX应运而生,但是从VUE3开始对VUEX的支持就不那么高了,官方推荐使用Pinia。 Vuex配置 ST1:…

NGINX之location和rewrite

一.NGINX常用的正则表达式 二.Location location作用:对访问的路径做访问控制或者代理转发 1.location 常用的匹配规则: 进行普通字符精确匹配,也就是完全匹配^~ / 表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 …

场外个股期权的杠杆率有多大?

场外个股期权作为金融衍生品的一种,为投资者在个股交易中提供了显著的杠杆效应。这种杠杆效应,简单来说,就是投资者通过较少的资金控制更大金额的投资,从而放大了投资收益的可能性,但同时也伴随着风险的增加。 文章来…

算法基础之哈希表

大家好,这里是教授.F 什么是哈希表: 哈希表其实就是数组的pro版本。数组有下标,每个下标对应着一个值。哈希表也类似,哈希表有很多哈希值,然后每一个哈希值都会对应着一个值。就是这样:hash(key) 哈希表的…

这个高考作文满分的极客,想和你聊聊新媒体写作

计育韬 曾为上海市高考作文满分考生 微信官方 SVG AttributeName 开发者 新榜 500 强运营人 复旦大学青年智库讲师 浙江传媒学院客座导师 上海团市委新媒体顾问 上海市金山区青联副主席 文案能力,从来就不是一蹴而就的。今天,来和大家聊聊当年我的…

端午档新片速递《谈判专家》领衔,每日影视作品推荐❗❗❗多部佳作待映

每日影视作品推荐一、新片速递《谈判专家》上映时间:2024年端午档预售情况:已开启预售,并有望成为该档期的票房冠军备注:据猫眼专业版数据,该片备受期待 《我才不要和你做朋友呢》上映时间:2024年端午档期预…

CSS函数: 实现数据限阈的数字函数

CSS函数中提供了几个比较实用的数字函数,它可以帮助我们实现一定的数学计算功能。常见的数字函数目前提供了五个:calc()、max()、min()和clamp()函数。其基本实现功能如下: calc():允许在声明 CSS 属性值时执行一些计算。max()&a…

智能推荐算法应用:如何提升淘宝在线扭蛋机用户购物体验

在淘宝的在线扭蛋机平台上,用户的购物体验至关重要。为了提升这一体验,我们引入了智能推荐算法,帮助用户发现他们可能感兴趣的扭蛋产品。这一技术的应用不仅提高了用户的购物效率,还大大增强了用户的购物乐趣。 一、智能推荐算法…

Python语法详解module2(运算符、表达式、流程控制)

目录 一、运算符1. 算术运算符(Arithmetic Operators)2. 比较运算符(Comparison Operators)3. 赋值运算符(Assignment Operators)4. 逻辑运算符(Logical Operators)5. 位运算符&…

cocos creator3.7版本拖拽事件处理

前言:网上能找到的资料都太落后了,导致哥们用AI去写,全是瞎B写,版本都不对。贴点实际有用的。别老捣鼓你那破convertToNodeSpaceAR或者convertToNodeSpace了。 核心代码 touch.getDeltaX() touch.getDeltaY() 在cocoscreator3…

Python | 刷题日记

1.海伦公式求三角形的面积 area根号下&#xff08;p(p-a)(p-b&#xff09;(p-c)) p是周长的一半 2.随机生成一个整数 import random xrandom.randint(0,9)#随机生成0到9之间的一个数 yeval(input("please input:")) if xy:print("bingo") elif x<y:pri…

sql 查询 不满足 (一个教师编号 的角色 (role =‘2‘or(role=‘1‘and role =‘0‘)) )

sql 查询 不满足 &#xff08;一个教师编号 的角色 &#xff08;role 2’or&#xff08;role1’and role ‘0’&#xff09;&#xff09; &#xff09; 准备 一个 teacher 表 和数据 表 teacher 和数据 -- ---------------------------- -- Table structure for teacher -- …