我有一个不完整的堆栈跟踪,它停在一个已知的库(linux i686架构)。为了确定上次调用的函数,我试图将$ eip作为gdb的输出映射到由" objdump -d library.so"生成的文件中的地址。 我以为我可以使用" info shared"的来自地址输出。在gdb中,以及$ eip来计算偏移量,然后我可以将其转换为objdump -d输出的反汇编文本部分的偏移量? 不确定这种方法是否合理,但在带有共享库的简单测试工具应用程序中尝试它并不能在正确的函数中给我一个地址。 任何帮助非常感谢。
答案 0 :(得分:1)
我想我可以使用" info shared"的来自地址输出。在gdb中,以及$ eip来计算偏移量,然后我可以将其转换为objdump -d输出的反汇编文本部分的偏移量?
是的,这正是您需要做的。
GDB显示中的From
地址会告诉您共享库的.text
部分位于何处。
readelf -S foo.so | grep '\.text'
会告诉您.text
本身的foo.so
偏移量。从另一个中减去一个,然后获得该共享库的重定位(它将是页面对齐的)。
现在从GDB中取出$eip
,减去重定位,然后您将获得一个与nm
的输出和objdump
的{{1}}匹配的地址。< / p>
然而,GDB已经在内部完成了上述所有步骤。如果无法推断出哪个函数foo.so
最终会出现,那么您不应期望手动执行这些步骤会产生更好的结果。