库函数objdump输出

时间:2015-12-04 04:02:57

标签: c++ c arm objdump

调试崩溃时,我有以下objdump输出。我可以将问题缩小到以下函数LanManager::Interface()库函数,但由于我对目标代码的经验不足,我无法从objdump输出中找到更多的意义。

以下是该库函数的开头部分。我想知道:

  • 起始地址是否是函数本身的地址?
  • 该函数地址与使用该函数的主可执行文件的地址有什么关系?
  • 此objdump输出中三列的简要说明。
  • 什么是_init?这是功能的开始吗?
  • 有没有办法解决<_init+0x10e4>指向的内容?

我不会期待一个完整的答案,任何能够获得一些亮点的东西都会受到赞赏。

0003629c <LanManager::Interface()>:
   3629c:   e1a0c00d    mov ip, sp
   362a0:   e92dd9f0    push    {r4, r5, r6, r7, r8, fp, ip, lr, pc}
   362a4:   e59f40b8    ldr r4, [pc, #184]  ; 36364 <LanManager::Interface()+0xc8>
   362a8:   e24cb004    sub fp, ip, #4  ; 0x4
   362ac:   e24dd004    sub sp, sp, #4  ; 0x4
   362b0:   e59f70b0    ldr r7, [pc, #176]  ; 36368 <LanManager::Interface()+0xcc>
   362b4:   e08f4004    add r4, pc, r4
   362b8:   e59f50ac    ldr r5, [pc, #172]  ; 3636c <LanManager::Interface()+0xd0>
   362bc:   e7940007    ldr r0, [r4, r7]
   362c0:   ebff6dc9    bl  119ec <_init+0x10e4>
   362c4:   e7942005    ldr r2, [r4, r5]
   362c8:   e5923000    ldr r3, [r2]
   362cc:   e3530000    cmp r3, #0  ; 0x0
   362d0:   0a000005    beq 362ec <LanManager::Interface()+0x50>
   362d4:   e7943005    ldr r3, [r4, r5]
   362d8:   e7940007    ldr r0, [r4, r7]
   362dc:   e5934000    ldr r4, [r3]

1 个答案:

答案 0 :(得分:1)

我试着在这里略微阐述一下,但是为了更深入,你可能想看一下关于ARM中的汇编编程或逆向工程的文本。

您正在查看LanManager::Interface的反汇编。是的,0003629c是函数指针本身的值。您的三列如下:

|地址|操作码反汇编|

_init是您反汇编的文件中的另一个符号。 LanManager :: Interface将从另一个函数的开头转移到整个页面的某个位置,这似乎有点奇怪。

当二进制文件的符号被剥离,并且objdump正在尝试确定地址的符号名称时,它将继续向后扫描,直到它最终找到一个。可能_init只是入口点或其他东西,我已经忘记了编译器发出的名字。

您可以在gdb中浏览并使用(gdb) disas *0x119ec反汇编特定地址。但是你真的从来没有说过你一开始会看到什么样的崩溃......如果你写了一个在图书馆电话中死亡的程序,我会花更多的时间来查看你传入的论点。