[英]Find load offset from global offset table
我想找到_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]
我在這里做錯了什么?
提前致謝。
AArch64地址是64位,而ldr x
讀取的是64位,但是您的.word
只有32位。 這導致地址以錯誤結尾。
增加池中字段的大小,並使用+8
加載第二個值。
無論如何,為了允許大於2G的程序,您應該使用64位偏移量。
您可能還需要重新考慮用於加載GOT [0]的模式。 ldr w2, [x2]
可能是正確的,但是您必須確認這一點。
我能夠編寫正確的代碼以加載AArch64中的got table的偏移量。 下面是代碼。
/* 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.