从全局偏移表中查找负载偏移量

时间:2014-09-04 10:29:36

标签: assembly arm

我想找到_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]

我在这里做错了什么?

提前致谢。

2 个答案:

答案 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