库函数objdump输出

Library function objdump output

本文关键字:输出 objdump 库函数      更新时间:2023-10-16

调试崩溃时,我有以下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]

我将尝试在这里阐明一些内容,但为了获得更多深度,您可能需要查看有关ARM或逆向工程中的汇编编程的文本。

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

|地址|操作码|反汇编|

_init是您反汇编的文件中的另一个符号。LanManager::Interface会分支到离另一个函数开始整整一页的某个位置,这似乎有点奇怪。

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

您可以在gdb中查找并使用(gdb) disas *0x119ec反汇编特定地址。然而,你真的从来没有说过你一开始看到的是什么样的车祸。。。如果你写的程序在库调用中奄奄一息,我会花更多的时间查看你传入的参数。