1

我正在尝试使用 gdb 理解一个小型二进制文件,但有些东西我找不到实现的方法:如何找到指向指定地址的跳转列表?我在反汇编代码中有一小部分指令,我想知道它在哪里被调用。一开始是想在.text中搜索对应的指令,但是由于跳转的种类很多,而且地址可以是相对的,所以这行不通。

有没有办法做到这一点?

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

4

1 回答 1

0

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

如果是实际跳转(相对于“跳转到子程序”)将您带到那里(我怀疑,如果它是从很多地方调用的,除非它是一种 longjmp/setjmp),那么您可能无法确定在哪里这是从那里调用的,除非您使用的 CPU 允许您以某种方式跟踪执行。

于 2013-02-28T08:41:53.127 回答