调试崩溃时,我有以下objdump输出。我可以将问题缩小到以下函数LanManager::Interface()
库函数,但由于我对目标代码的经验不足,我无法从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]
答案 0 :(得分:1)
我试着在这里略微阐述一下,但是为了更深入,你可能想看一下关于ARM中的汇编编程或逆向工程的文本。
您正在查看LanManager::Interface
的反汇编。是的,0003629c
是函数指针本身的值。您的三列如下:
|地址|操作码反汇编|
_init
是您反汇编的文件中的另一个符号。 LanManager :: Interface将从另一个函数的开头转移到整个页面的某个位置,这似乎有点奇怪。
当二进制文件的符号被剥离,并且objdump正在尝试确定地址的符号名称时,它将继续向后扫描,直到它最终找到一个。可能_init
只是入口点或其他东西,我已经忘记了编译器发出的名字。
您可以在gdb中浏览并使用(gdb) disas *0x119ec
反汇编特定地址。但是你真的从来没有说过你一开始会看到什么样的崩溃......如果你写了一个在图书馆电话中死亡的程序,我会花更多的时间来查看你传入的论点。