执行arm blx rx时EXC_BAD_ACCESS

时间:2014-09-01 18:38:14

标签: c arm clang lldb thumb

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

ret = fnPtr (param1, param2);

在调试器中,fnPtr的地址为0x04216c00。当我在电脑上反汇编它指向上面的陈述时,这就是我得到的:

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代码。编译器很铿锵。

2 个答案:

答案 0 :(得分:1)

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

尝试通过-mno-thumb强制clang到arm模式进行测试。

答案 1 :(得分:1)

EXC_BAD_ACCESS异常中有两位数据,第一位是描述访问失败的“kern_return_t”号,第二位是访问的地址。在你的情况下,代码是2,这意味着(来自/usr/include/mach/kern_return.h):

#define KERN_PROTECTION_FAILURE         2
                /* Specified memory is valid, but does not permit the
                 * required forms of access.
                 */

不确定为什么会发生这种情况,听起来就像是在尝试执行没有执行权限集的代码。做什么:

(lldb) image lookup -va 0x4216c00

说什么?

BTW,异常类型在/usr/include/mach/exception_types.h中,如果代码具有特定于机器的含义,那么这些代码将在例如/usr/include/mach/i386/exception.h)对于ARM信息,您可能需要查看Xcode SDK中的标题。