- LDR* 由于Apple的安全性思想而无法正常工作,但我如何加载,例如:
.data
.align 4
.mynumber: .quad 0x123456789ABCDEF0
我知道ADRP,但我不确定我是否理解它是如何工作的。
我已经这样做了(ADRP,@PAGE,@PAGEOFF取自其他来源):
.global _start
.text
_start:
ADRP X2, arr1@PAGE
ADD X2, X2, arr1@PAGEOFF
mov X0, #0 // Use 0 return code
mov X16, #1 // System call number 1 terminates this program
svc #0x80 // Call kernel to terminate the program
.data
.align 4
arr1: .FILL 10, 4, 0
mynumber: .quad 0x123456789ABCDEF0
myoctaword: .octa 0x12345678876543211234567887654321
1条答案
按热度按时间m528fe3b1#
“按标签加载数据”工作得非常好:
在达尔文上不起作用的是
ldr x0, =...
,因为这是语法糖:由于
label
是一个静态编码的地址,它需要由动态链接器重定基,这会在尝试时崩溃进程,因为__TEXT
段既被Map为r-x
又被协同设计。要获取某些标签的地址,可以使用
adr
:但这只能在±1MiB范围内工作,此外,工具链只允许您在同一段内执行此操作,即
__TEXT
。对于一般情况,adrp+add
是要走的路:但是,如果结果偏移量在范围内,您可以使用
.loh AdrpAdd ...
指令让链接器将其修复回adr+nop
:如果需要的话,
adrp+ldr
也可以这样做,同样,如果在范围内,.loh AdrpLdr ...
可以将其转换为PC相关的ldr
。