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所在页的页基地址到X0LDR X1, [X0, #offset] ; 从X0 + offset处加载实际数据到X1

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

总结

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

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

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

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

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

相关文章

Linux C语言学习:数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址(类似门牌号) • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

密码学基本概念(补充)

BiBa模型的*特性规则:主体不能修改更高完整级的客体(主题不能向上写) Diffie-Hellman密钥交换协议的安全性基于求解离散对数的困难性,既对于C^d M mod P,在已知C和P的前提下,由d求M很容易,但是…

Transformer系列:图文详解KV-Cache,解码器推理加速优化

前言 KV-Cache是一种加速Transformer推理的策略,几乎所有自回归模型都内置了KV-Cache,理解KV-Cache有助于更深刻地认识Transformer中注意力机制的工作方式。 自回归推理过程知识准备 自回归模型采用shift-right的训练方式,用前文预测下一个…

EditPlus 输入错误: 没有文件扩展“.js”的脚本引擎

原因 JS扩展名的文件被其他软件关联了,需要取消关联 解决办法 cmd窗口,输入 regedit 进入注册表, 打开注册表编辑器,定位[HKEY_CLASSES_ROOT\.js]这一项,双击默认值将其改为“JSFile”即可

Codeforces Round 948 (Div. 2) A~D

A. Little Nikita (思维) 题意: 小 A A A决定用一些立方体建一座塔。一开始,塔上没有任何立方体。在一次移动中,小 A A A要么正好把 1 1 1 个立方体放到塔顶,要么正好从塔顶移走 1 1 1 个立方体。存不存…

信息可溯、安全可控 | SW-LIMS 采测分离监测模式解析

数据的准确性在环境监测过程中至关重要,为了确保环监数据的真实有效,并满足“全程留痕、全程监控、信息可溯、安全可控”的要求,采测分离监测模式是一个有效的解决方案。 这种模式通过将样品采集和样品检测交由不同的单位完成,形成了相互独立、相互监督的工作机制,有助于减少潜…

LeetCode刷题之HOT100之跳跃游戏

2024/6/5 今天下起了绵密细雨,空气清新很多。昨晚做的梦较魔幻,可能也是导致我睡觉时业已破损的小米手环8的表腕断裂的因素之一。来到实验室,打扫一下卫生,听听歌,做道题。好不自在呀! 1、题目描述 2、逻辑…

mysql中optimizer trace的作用

大家好。对于MySQL 5.6以及之前的版本来说,查询优化器就像是一个黑盒子一样,我们只能通过EXPLAIN语句查看到最后 优化器决定使用的执行计划,却无法知道它为什么做这个决策。于是在MySQL5.6以及之后的版本中,MySQL新增了一个optimi…

我国液碱产量逐渐增长 行业集中度有望不断提升

我国液碱产量逐渐增长 行业集中度有望不断提升 液碱是由氢氧化钠(NaOH)、氢氧化钾(KOH)等化合物以及水组成的一种碱性化合物。液碱的相对分子质量为40.00,密度为1.318g/cm,在常温常压下多表现为一种无色、无…

12 - 常用类

那就别跟他们比,先跟自己比,争取今天比昨天强一些,明天比今天强一些。 1.包装类 针对八种基本数据类型封装的相应的引用类型。 有了类的特点,就可以调用类中的方法。(为什么要封装) 基本数据类型包装类b…

JavaSE——学习总结

一、初识Java 运行Java程序 Java是一门半编译型、半解释型语言 先通过javac编译程序把源文件进行编译,编译后生成的.class文件是由字节码组成的,和平台无关、面向JVM的文件,最后启动java虚拟机来运行.class文件,此时JVM会将字节…

目标检测数据集 - 城市道路行驶车辆检测数据集下载「包含VOC、COCO、YOLO三种格式」

​​​数据集介绍:城市道路行驶车辆检测数据集,真实监控场景高质量图片数据,涉及场景丰富,比如城市道路快速行驶车辆、城市道路慢速行驶车辆、城市道路密集行驶车辆、城市道路夜间低光行驶车辆数据等。数据集标注标签划分为 "…

python-字符替换

[题目描述] 给出一个字符串 s 和 q 次操作,每次操作将 s 中的某一个字符a全部替换成字符b,输出 q 次操作后的字符串输入 输入共 q2 行 第一行一个字符串 s 第二行一个正整数 q,表示操作次数 之后 q 行每行“a b”表示把 s 中所有的a替换成b输…

使用kubespray部署k8s生产环境

使用kubespray部署k8s生产环境 系统环境 OS: Static hostname: test Icon name: computer-vm Chassis: vm Machine ID: 22349ac6f9ba406293d0541bcba7c05d Boot ID: 83bb7e5dbf27453c94ff9f1fe88d5f02 Virtualization: vmware Operating System: Ubuntu 22.04.4 LTS Kernel: L…

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文件…

echarts legend. icon的展示

默认展示 icon展示circle圆形rect矩形roundRect圆角矩形triangle三角形diamond菱形pin水滴arrow箭头none不显示

Redis位图

简介 在我们平时开发过程中,会有一些bool型数据需要存取,比如用户一年的签到记录,签了是1,没签是0,要记录365天。如果使用普通的key/value,每个用户要记录365个,当用户上亿的时候,需…

数据中心综合解决方案

安科瑞电气股份有限公司 祁洁 acrelqj 一、方案介绍 安科瑞电气紧跟数据中心发展形式,推出数据中心综合解决方案,集成了变配电监测、电源备自投、电气接点测温、智能照明控制、电能质量监测及治理、蓄电池在线监测、精密配电监控、智能母线监控以及消…

重要经济数据对行情的影响有多大?

金融市场上的消息非常多,可以来自不同国家、不同大型企业,也可以由不同机构统计公布,甚至是各国政府或中央银行的发表。在宏观经济层面上,所有政经消息都属于金融市场的风险事件,大多能引起市场波动,因此投…

android 开机动画执行流程

android深入了解开机动画 开机动画的种类 1:View绘制 2:逐帧动画:比较主流的方式,一般动画的文件打包成 bootanimation.zip 存储到 /system/media/ 下。一般.zip文件 > 5M 就会有明显的卡顿,所以一般开机动画只有…