c++ - 库函数 objdump 输出

标签 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]

最佳答案

我会尝试在这里阐明一点,但要更深入,您可能需要查看有关 ARM 中的汇编编程或逆向工程的文本。

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

|地址 |操作码 |拆卸|

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

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

您可以在 gdb 中四处寻找并使用 (gdb) disas *0x119ec 反汇编特定地址。然而,您真的永远不会说您首先看到的是哪种崩溃……如果您编写的程序在调用库时死机,我会花更多时间查看您传入的参数。

关于c++ - 库函数 objdump 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34080732/

相关文章:

c++ - 将 IplImage 转换为 Qpixmap

c++ - rs232串口超时怎么解决?

c - 如何将列表的节点存储到共享内存中

c++ - 如何从函数正确返回数组?

c++ - 在 C 和 C++ 中都有效的代码在用每种语言编译时是否会产生不同的行为?

c - 在 CentOS 5.4 中编译 netfilter_queue 遇到困难(GCC 错误)

c - *(int32_t *)(a + 4) = b 是什么意思?

linux - ARM 内联汇编 : exit system call with value read from memory

c - 微 Controller 中的内存映射

c++ - Set-Intersection C++ 使用文本文件