库函数objdump输出
Library function objdump output
调试崩溃时,我有以下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++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- OBJDUMP给出了具有和没有-fpic的对象文件的相同输出
- 如何获取与 objdump 输出的标签相对应的 ELF 二进制文件中的文件偏移量
- 库函数objdump输出
- objdump输出中符号名的组成部分