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

Assembly 从全局偏移表中查找负载偏移,assembly,arm,Assembly,Arm,我想找到_动态结构偏移量,它在启动时位于AArch64中的_全局_偏移量_表0]上,并且得到的条目尚未重新定位 我用汇编语言编写代码 .text .globl _start .type _start,%function _start: mov x0, sp sub sp, sp, #132 /* Find our load offset at GOT[0] */ ldr x1,

我想找到_动态结构偏移量,它在启动时位于AArch64中的_全局_偏移量_表0]上,并且得到的条目尚未重新定位

我用汇编语言编写代码

    .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表加载偏移量。 下面是代码

    /* 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

每一行上都有一条评论可以帮助你更快地回答问题。就目前而言,没有注释对那些想帮助你的人来说是一个障碍。你有没有试过在这个代码段上使用调试器?@User.1当然,我添加了有用的注释。@IgorSkochinsky我已经描述了调试后出现分段错误的确切行。当你在二进制文件上执行
objdump-d
时,池中的值看起来正常吗?它们是否与右侧符号的偏移相对应?ELF加载标志是否设置在包含GOT的部分上?