我正在开发一个与流相关的 native 应用程序,我在我的 c 模块中遇到了一些问题......我所拥有的是来自 Logcat 的一些消息
这是 Logcat 消息
INFO/DEBUG(28): Build fingerprint: 'generic/sdk/generic/:2.1-update1/ECLAIR/35983:eng/test-keys'
11-17 12:40:07.550: INFO/DEBUG(28): pid: 5957, tid: 5957 >>> com.mmstwo <<<
11-17 12:40:07.561: INFO/DEBUG(28): signal 11 (SIGSEGV), fault addr deadd00d
11-17 12:40:07.561: INFO/DEBUG(28): r0 00000354 r1 00129100 r2 0000000c r3 deadd00d
11-17 12:40:07.561: INFO/DEBUG(28): r4 00000026 r5 ad07ff50 r6 00000000 r7 fffe72f8
11-17 12:40:07.579: INFO/DEBUG(28): r8 afe3bdfc r9 4509f020 10 00000000 fp 00135a40
11-17 12:40:07.590: INFO/DEBUG(28): ip ad080160 sp bef28f90 lr afe14cf7 pc ad035452 cpsr 20000030
11-17 12:40:07.840: INFO/DEBUG(28): #00 pc 00035452 /system/lib/libdvm.so
11-17 12:40:07.850: INFO/DEBUG(28): #01 pc 00027a98 /system/lib/libdvm.so
11-17 12:40:07.869: INFO/DEBUG(28): #02 pc 00027bba /system/lib/libdvm.so
11-17 12:40:07.879: INFO/DEBUG(28): #03 pc 0002d98e /system/lib/libdvm.so
11-17 12:40:07.901: INFO/DEBUG(28): #04 pc 0000142e /data/data/com.mmstwo/lib/libnstreamer.so
这是代表我使用的 c 类的行。
根据对 my previous question 的评论我按照 rahul 给出的 url 将我的 .so 文件转储到文本文件。
这是文本文件
141e: 4a2d ldr r2, [pc, #180] (14d4 <Java_com_mmstwo_NativeParser_stringFromJNI+0x408>)
1420: 4b2d ldr r3, [pc, #180] (14d8 <Java_com_mmstwo_NativeParser_stringFromJNI+0x40c>)
1422: 2184 movs r1, #132
1424: 5846 ldr r6, [r0, r1]
1426: 18aa adds r2, r5, r2
1428: 18eb adds r3, r5, r3
142a: 4651 mov r1, sl
142c: 1c38 adds r0, r7, #0
142e: 47b0 blx r6
1430: 4b2a ldr r3, [pc, #168] (14dc <Java_com_mmstwo_NativeParser_stringFromJNI+0x410>)
1432: 4669 mov r1, sp
所以根据post in google groups在 Nicklas Ansman 的特别建议下,我展示了我想要的行 142e
附近的代码 fragment 。
现在这里有人能说出 47b0 blx r6
是什么意思吗?
我所知道的是它是用我不知道的汇编语言编写的东西。所以我需要你的帮助来理解那句话。
提前致谢
最佳答案
blx
跳转到参数给定的地址;在这里,到当前加载到寄存器 r6 中的地址。此外,返回地址(即 blx
之后的 ldr
操作码的地址)被写入专用寄存器 lr(作为“链接寄存器”) ).
这对应于间接调用。在 C 中,它看起来像是通过函数指针的调用。在某些具有动态链接的平台上,对函数的简单函数调用也可以像您在此处看到的那样。
无论如何,寄存器转储显示此时 r6 为 0,因此出现了段错误。 r6 从地址 1424 上的 ldr
操作码加载。这从地址 r0+r1 加载 r6,r1 在上面设置为 132。 r0 是 C 函数第一个参数的常规寄存器。
关于android - .so 文件的 objdump?需要帮助来理解消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4202670/