【问题标题】:objdump of a .so file? need help to understand the messages.so 文件的 objdump?需要帮助来理解消息
【发布时间】:2010-11-17 08:32:00
【问题描述】:

我正在开发一个与流相关的本机应用程序,我在我的 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 上的 cmets,我遵循 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 周围的 sn-p。

现在有谁能知道47b0 blx r6 是什么意思吗?

我所知道的是它是用我不知道的汇编语言编写的。所以我需要你的帮助来理解那条线。

提前致谢

【问题讨论】:

  • FWIW,故障地址“deadd00d”表示 VM 故意中止。在中止 VM 之前,将解释写入日志文件;您应该在您粘贴的内容上方看到它。

标签: android assembly android-ndk


【解决方案1】:

blx 跳转到参数给定的地址;此处,指向当前加载到寄存器 r6 中的地址。另外,返回地址(即紧跟在blx之后的ldr操作码的地址)写入专用寄存器lr(作为“链接寄存器”)。

这对应于间接调用。在 C 中,它看起来像是通过函数指针进行的调用。在某些具有动态链接的平台上,对函数的简单函数调用也可以像您在此处看到的那样。

无论如何,此时寄存器转储显示 r6 为 0,因此出现了段错误。 r6 是从地址 1424 上的 ldr 操作码加载的。这会从地址 r0+r1 加载 r6,r1 被设置为上面的 132。 r0 是 C 函数第一个参数的常规寄存器。

【讨论】:

  • 非常感谢 Thomas,这超出了我的预期。
  • 还有一件事......是否有任何指南提供所有汇编命令的详细列表并进行适当解释?
  • 您可以从infocenter.arm.com 获得 ARM 架构参考手册(您必须注册,但它是免费的)。您还需要过程调用标准(ATPCS 或 AAPCS,具体取决于代 - ARM 世界是一团糟):过程调用标准定义了参数在哪些寄存器中,堆栈如何维护和对齐,等等开。
【解决方案2】:

好的,通过谷歌上的一些怪胎挖掘来找到它。'

blx 的意思是 Branch and link with exchange (BLX),如果我没记错的话,它类似于 return withValue 类型的 java 语句。

它也帮助我开始在本机代码中进行调试......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-06
    • 1970-01-01
    • 2010-10-17
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    相关资源
    最近更新 更多