gpt4 book ai didi

c - 执行 arm blx rx 时出现 EXC_BAD_ACCESS

转载 作者:太空宇宙 更新时间:2023-11-04 08:37:35 24 4
gpt4 key购买 nike

这是在 armv7 上崩溃的 c 源代码行:

ret = fnPtr (param1, param2);

在调试器中,fnPtr 的地址为 0x04216c00。当我在指向上面语句的 pc 上反汇编时,这是我得到的:

0x18918e:  movw   r0, #0x73c
0x189192: movt r0, #0x1
0x189196: add r0, r2
0x189198: ldr r0, [r0]
0x18919a: str r0, [sp, #0x20]
0x18919c: ldr r0, [sp, #0x20]
0x18919e: ldr r1, [sp, #0x28]
0x1891a0: ldr r2, [sp, #0x2c]
0x1891a2: str r0, [sp, #0x14]
0x1891a4: mov r0, r1
0x1891a6: mov r1, r2
0x1891a8: ldr r2, [sp, #0x14]
0x1891aa: blx r2

现在,当我反汇编位于地址 $r2 (=0x4216c00) 的内存时,我得到了看似有效的代码,应该可以毫无问题地执行:

(lldb) disassemble -s 0x4216c00 -C 10
0x4216c00: push {r4, r5, r6, r7, lr}
0x4216c04: add r7, sp, #0xc
0x4216c08: push {r8, r10, r11}
0x4216c0c: vpush {d8, d9, d10, d11, d12, d13, d14, d15}
0x4216c10: sub r7, r7, #0x280
0x4216c14: mov r6, r0
0x4216c18: bx r1
0x4216c1c: add r7, r7, #0x280

然而真正发生的是这样的:

EXC_BAD_ACCESS(代码=2,地址=0x4216c00)

谁能解释哪里出了问题以及为什么该地址被认为是非法的?

完全披露:我不是装配专家。编译和链接的代码都是c代码。编译器是 clang。

最佳答案

在调用执行blx指令之前检查r2的值。这可能很奇怪,告诉 cpu 地址处于 thumb 模式,但是从列表中它看起来像是处于 arm 模式。

尝试通过 -mno-thumb 强制 clang 进入 arm 模式来测试这一点。

关于c - 执行 arm blx rx 时出现 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25611359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com