Assembly 从全局偏移表中查找负载偏移
我想找到_动态结构偏移量,它在启动时位于AArch64中的_全局_偏移量_表0]上,并且得到的条目尚未重新定位 我用汇编语言编写代码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,
.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的部分上?