gdb:findind每跳一个地址

gdb:findind每跳一个地址,gdb,memory-address,disassembly,Gdb,Memory Address,Disassembly,我试图理解一个使用gdb的小二进制文件,但有一点我找不到实现的方法:如何找到指向指定地址的跳转列表? 我在反汇编代码中有一小部分指令,我想知道在哪里调用它。 我首先考虑在.text中搜索相应的指令,但由于有很多种跳转,并且地址可以是相对的,所以这不起作用 有办法吗 或者,如果我在这个地址上放了一个断点,有没有办法知道上一条指令的地址(在本例中是跳转)?如果这是从其他地方调用的某个子例程,那么它在调用时必须遵守某些ABI。 根据使用的CPU,返回地址(以及调用它的位置)将存储在某个位置(堆栈上或某

我试图理解一个使用gdb的小二进制文件,但有一点我找不到实现的方法:如何找到指向指定地址的跳转列表? 我在反汇编代码中有一小部分指令,我想知道在哪里调用它。 我首先考虑在.text中搜索相应的指令,但由于有很多种跳转,并且地址可以是相对的,所以这不起作用

有办法吗

或者,如果我在这个地址上放了一个断点,有没有办法知道上一条指令的地址(在本例中是跳转)?

如果这是从其他地方调用的某个子例程,那么它在调用时必须遵守某些ABI。 根据使用的CPU,返回地址(以及调用它的位置)将存储在某个位置(堆栈上或某些寄存器中)。如果将原始代码替换为检查此代码的代码,则可以创建一个返回地址列表。或者更简单,如您所建议的,如果您使用gdb并在该例程上放置一个断点,您可以从使用bt命令调用它的位置看到它


如果是实际的跳转(而不是“跳转到子例程”)导致您到达那里(我怀疑,如果它是从许多地方调用的,除非它是一种longjmp/setjmp),那么您可能无法确定它是从哪里调用的,除非您使用的CPU允许您以某种方式跟踪执行情况。

是的,我说的是一种跳远,但您是对的,我只需要在最后跟随跳转,返回到初始“函数”。本可以考虑一下,但我已经习惯了OllyDbg中的“查找指向此处的跳跃”功能。不过,在gdb中使用它可能会很有用。正如您所指出的,另一种解决方案是使用回溯,但它会导致我正在寻找的父函数(因为跳转没有在调用堆栈上放置任何内容)。无论如何,这可能是一个解决方案。谢谢你的回复!