簡體   English   中英

從全局偏移量表中查找負載偏移量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM