1

我有一个不完整的堆栈跟踪,它在一个已知的库(linux i686 架构)处停止。为了确定最后调用的函数,我试图将 $eip 作为 gdb 的输出映射到由“objdump -d library.so”生成的文件中的地址。我想我也许可以使用 gdb 中“信息共享”的 From 地址输出,以及 $eip 来计算偏移量,然后我可以将其转换为来自 objdump -d 输出的反汇编文本部分的偏移量?不确定这种方法是否明智,但在一个带有共享库的简单测试工具应用程序中尝试它并没有在正确的函数中给我一个地址。非常感谢任何帮助。

4

1 回答 1

1

我想我也许可以使用 gdb 中“信息共享”的 From 地址输出,以及 $eip 来计算偏移量,然后我可以将其转换为来自 objdump -d 输出的反汇编文本部分的偏移量?

是的,这正是您需要做的。

GDB 显示中的From地址告诉您.text共享库的部分所在的位置。

会告诉你自己的readelf -S foo.so | grep '\.text'偏移.textfoo.so。从另一个中减去一个,您将获得该共享库的重定位(它将是页面对齐的)。

现在$eip从 GDB 中取出,减去重定位,您将得到一个与nmobjdumpfor 的输出相匹配的地址foo.so

但是,GDB 内部已经完成了上述所有步骤。如果它无法推断出$eip最终是哪个函数,那么您不应该期望手动执行这些步骤会产生更好的结果。

于 2012-09-13T04:51:23.190 回答