Crash(SIGILL)在Android上加载本机库:如何获取ARM指令?

时间:2013-11-05 21:15:35

标签: android assembly android-ndk arm v8

我为ARM编译了v8,它可以在大多数arm6 / 7手机上正常加载。加载本机库时,某些特定设备(如HTC Wildfire S)会崩溃。

这是我得到的SIGILL(无效指令):

31-31/? I/DEBUG﹕ *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
31-31/? I/DEBUG﹕ Build fingerprint: 'generic/sdk/generic/:2.2/FRF91/43546:eng/test-keys'
31-31/? I/DEBUG﹕ pid: 312, tid: 312  >>> org.myapp <<<
31-31/? I/DEBUG﹕ signal 4 (SIGILL), fault addr 81494f98
31-31/? I/DEBUG﹕ r0 00000001  r1 00000003  r2 81494f8e  r3 81494f8c
31-31/? I/DEBUG﹕ r4 8198a26c  r5 00000003  r6 00000004  r7 00000000
31-31/? I/DEBUG﹕ r8 42189eac  r9 00000374  10 0000ce04  fp bef6765c
31-31/? I/DEBUG﹕ ip 8124695c  sp bef67658  lr b0001169  pc 81494f98  cpsr 80000010
31-31/? I/DEBUG﹕ #00  pc 00494f98  /data/data/org.myapp/lib/libjv8.so

我可以使用ndk-stack来获取v8中崩溃的特定行,但它实际上是指宏,所以我不知道正在执行哪条特定指令。

我尝试使用gdb-server连接到设备,但它没有提供有关该指令的更多详细信息:

Program received signal SIGILL, Illegal instruction.
0x81494f98 in ?? ()

所以我有点迷失了。有没有办法将0x81494f98转换为特定的ARM指令?

1 个答案:

答案 0 :(得分:0)

感谢@ChrisStratton,这就是我能够找到导致SIGILL的特定ARM指令的方法:

$ arm-whatever-objdump -d <lib_path> | grep <pc_address>

或在我的情况下:

$ arm-whatever-objdump -d libjv8.so | grep 494f98

它产生了以下一行:

494f98: e30f1fff movw   r1, #65535  ; 0xffff