【发布时间】:2014-01-22 04:46:26
【问题描述】:
当我在gdb 中使用disas 时。我可能会得到这样的东西。
(gdb) disas bar
Dump of assembler code for function bar:
0x08048e84 <+0>: push %ebp
0x08048e85 <+1>: mov %esp,%ebp
0x08048e87 <+3>: sub $0x8,%esp
0x08048e8a <+6>: mov 0xc(%ebp),%eax
0x08048e8d <+9>: mov 0x8(%ebp),%edx
0x08048e90 <+12>: add %edx,%eax
0x08048e92 <+14>: mov %eax,-0x4(%ebp)
0x08048e95 <+17>: mov 0x81f4074,%eax
0x08048e9a <+22>: mov %eax,(%esp)
0x08048e9d <+25>: call 0x8048ed8 <traceback>
0x08048ea2 <+30>: mov -0x4(%ebp),%eax
0x08048ea5 <+33>: mov %eax,0x8(%ebp)
0x08048ea8 <+36>: leave
0x08048ea9 <+37>: ret
End of assembler dump.
假设我的 C 程序中有 0x08048ea2。我怎么可能获得偏移量<+30> 并获得0x08048e84。
【问题讨论】:
-
反汇编程序已经告诉你偏移量,所以不清楚这里的问题是什么......
-
对不起,如果我没有把我的问题说清楚。我想在我的 C 程序中使用偏移量,我怎样才能在我的 C 程序中得到它?我通过编写一个小的汇编文件得到了返回地址
0x08048ea2。但我其实想得到0x08048e84 -
我正在实现回溯功能。
-
所以你想从给定的 EIP 扫描回来并找到函数的开始?
-
嗯,好的。我不知道调试器实际上是如何做到的。但我能想到两种可能。一种是简单地维护所有功能所在位置的地图,然后只需查找您的地址。第二个是将堆栈返回到previous返回地址,并查看上面的指令,这将是对相关函数地址的调用。
标签: c assembly linker operating-system stack