我正在尝试使用gdb理解一个小二进制文件,但有些东西我找不到实现的方法:如何找到指向指定地址的跳转列表? 我在反汇编代码中有一小组指令,我想知道它在哪里被调用。 我首先考虑在.text中搜索相应的指令,但由于有很多类型的跳转,并且地址可以是相对的,所以这不起作用。
有办法吗?
或者,如果我在这个地址上设置一个断点,有没有办法知道前一条指令的地址(在这种情况下,跳转)?
答案 0 :(得分:0)
如果这是从其他地方调用的某些子例程,那么在调用它时必须尊重某些ABI。 根据所使用的CPU,返回地址(以及调用它的位置)将存储在某处(堆栈或某些寄存器中)。如果将原始代码替换为检查此代码的原始代码,则可以创建返回地址列表。或者更简单,正如您所建议的那样,如果您使用gdb并在该例程中放置断点,则可以使用bt命令查看它的调用位置。
如果它是实际的跳跃(相对于#34;跳转到子程序")导致你在那里(我怀疑,如果它从很多地方打来,除非它是一种longjmp / setjmp),那么你可能无法确定调用它的位置,除非你使用的CPU允许你以某种方式跟踪执行。