我想找到_DYNAMIC结构偏移,它在启动时位于AArch64中的_GLOBAL_OFFSET_TABLE_ [0]上,而GOT条目尚未重新定位。
我在汇编中编写代码。
.text
.globl _start
.type _start,%function
_start:
mov x0, sp
sub sp, sp, #132
/* Find our load offset at GOT[0] */
ldr x1, .Lpool
.LPIC0: add x1, x1, .LPIC0 // x1=address of _DYNAMIC
ldr x2, .Lpool+4
add x2, x2, .LPIC0 // x2=address of GOT
ldr x2, [x2] // x2=GOT[0]
sub x1, x1, x2 // load offset of _DYNAMIC
bl my_function
ldr x1, [sp]
mov sp, x1
br x0
.align 2
.Lpool: .word _DYNAMIC-.LPIC0
.word _GLOBAL_OFFSET_TABLE_-.LPIC0
.size _start,.-_start
当我运行代码时,我会在以下代码行中获得分段错误(调试显示):
ldr x2, [x2]
我在这里做错了什么?
提前致谢。
答案 0 :(得分:1)
AArch64地址为64位,ldr x
读取为64位,但您的.word
仅为32位。这导致地址错误。
增加池中字段的大小,并使用+8
加载第二个值。
在任何情况下,为了允许大于2G的程序,您应该使用64位偏移。
您可能还想重新考虑用于加载GOT [0]的模式。 ldr w2, [x2]
可能是对的,但您必须确认这一点。
答案 1 :(得分:0)
我能够编写正确的代码来加载AArch64中的got表的偏移量。 以下是代码。
/* Find our load offset at GOT[0] */
adrp x1, _DYNAMIC
add x1, x1,#:lo12:_DYNAMIC \\ address of _DYNAMIC
adrp x2, _GLOBAL_OFFSET_TABLE_
ldr x2, [x2,#:lo12:_GLOBAL_OFFSET_TABLE_] \\GOT[0]
sub x1, x1, x2