gpt4 book ai didi

c++ - 库函数 objdump 输出

转载 作者:行者123 更新时间:2023-11-28 05:56:29 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com