调试崩溃时,我有以下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]发布于 2015-12-04 04:58:09
我将在这里尝试一点启示,但为了更深入,您可能想看看ARM或逆向工程中的组装编程的文本。
您正在查看LanManager::Interface的反汇编。是的,0003629c是函数指针本身的值。你的三栏看起来像:
地址-操作码
_init是您解压缩的文件中的另一个符号。看起来有点奇怪的是,LanManager::Interface会分支到某个位置--从另一个函数开始到整个页面。
当二进制代码被删除,而objdump试图确定地址的符号名时,它会一直向后扫描,直到最终找到一个。很可能_init只是一个入口点,我忘记了编译器在我头上发出的名称。
您可以在gdb中穿插,并使用(gdb) disas *0x119ec分解特定地址。但是你从来没有说过你最初看到的是什么样的撞车.如果你写了一个在库调用中死去的程序,我会花更多的时间看你传入的论点。
https://stackoverflow.com/questions/34080732
复制相似问题