MacOS下arm64架构中ldr =指令的静态与动态链接疑问
关于macOS ARM64架构下符号加载指令的疑问
在macOS的ARM64架构编程中,无法使用以下代码:
.text ldr X0, =my_string .data my_string: .asciz "Hello There"
必须将ldr指令替换为:
adrp X0, my_string@PAGE add X0, X0, my_string@PAGEOFF
在非macOS的加载器中,前者会被转换为:
ldr X0, fakeLabel ... fakeLabel: .quad my_string
并在链接阶段修正fakeLabel处的值。而macOS与非macOS的链接器都需要计算adrp所在页与my_string所在页的差值并写入指令。
此前得到的答复称前者属于“动态加载”被禁止,后者是“静态加载”合法,但我不理解两者的差异——两者都涉及指令修改。
核心疑问:
adrp与my_string的页间差值是否固定?- 即使加载地址未知,text段与data段的加载距离是否始终固定?
- 我是否遗漏了什么?
- 相关内容是否有官方文档说明?
内容的提问来源于stack exchange,提问作者Frank Yellin
相关产品推荐
相关产品推荐

