问题描述
我有一个 arm32 v7a 函数的转储,在它的序言中我看到以下内容:
0xef8137a4 ldr r3,[pc,#248]
0xef8137a8 strd r4,[sp,#-24]!
0xef8137ac cmp r0,#1
0xef8137b0 ldr r12,#240]
0xef8137b4 strd r6,#8]
0xef8137b8 mov r4,r0
0xef8137bc ldr r2,#232]
0xef8137c0 str r11,#16]
0xef8137c4 mov r5,r1
0xef8137c8 str lr,#20]
0xef8137cc add r11,sp,#20
在第二行 ( strd r4 [sp,#-24]!
) 上,它将堆栈指针递减 24,但在最后一行 ( add r11,#20
) 上,它将 fp 设置为当前堆栈指针 + 20。我看不到任何其他会修改 sp 的行。因此 r11 (fp) 将比旧的 sp 大 4。
据我所知,fp 应该设置为旧的 sp(这是堆栈展开所必需的)。是我错了,还是我在 ASM 代码中遗漏了什么? (注意——代码是用-fno-omit-frame-pointer
编译的,函数体中没有修改r11)
----------- 编辑 -------------
更完整的 objdump(构建在另一台机器上,但适用相同的原则)如下所示:
/* Get current value of CLOCK and store it in TP. */
int
__clock_gettime (clockid_t clock_id,struct timespec *tp)
{
0: e59f30a0 ldr r3,#160] ; a8 <__clock_gettime+0xa8>
4: e16d41f8 strd r4,#-24]! ; 0xffffffe8
8: e1a04000 mov r4,r0
return INLINE_VSYSCALL (clock_gettime,2,clock_id,tp);
c: e59fc098 ldr ip,#152] ; ac <__clock_gettime+0xac>
{
10: e1cd60f8 strd r6,#8]
14: e1a05001 mov r5,r1
return INLINE_VSYSCALL (clock_gettime,tp);
18: e59f2090 ldr r2,#144] ; b0 <__clock_gettime+0xb0>
{
1c: e58db010 str fp,#16]
20: e28db014 add fp,#20
24: e58de014 str lr,#20]
28: e08f3003 add r3,pc,r3
return INLINE_VSYSCALL (clock_gettime,tp);
2c: e793c00c ldr ip,[r3,ip]
...
74: e24bd014 sub sp,fp,#20
78: e1cd40d0 ldrd r4,[sp]
7c: e1cd60d8 ldrd r6,#8]
80: e59db010 ldr fp,#16]
84: e28dd014 add sp,#20
88: e49df004 pop {pc} ; (ldr pc,[sp],#4)
return INLINE_VSYSCALL (clock_gettime,tp);
8c: e59f3020 ldr r3,#32] ; b4 <__clock_gettime+0xb4>
90: e2601000 rsb r1,r0,#0
94: ee1d2f70 mrc 15,r2,cr13,cr0,{3}
98: e3e00000 mvn r0,#0
9c: e79f3003 ldr r3,r3]
a0: e7821003 str r1,[r2,r3]
a4: eafffff2 b 74 <__clock_gettime+0x74>
a8: 00000078 .word 0x00000078
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)