64位Linux上程序/指令指针(RIP)和基址/帧指针(RBP)之间的关系
我需要一些帮助来检索 Linux 64 位 机器上调用堆栈的指令指针 (RIP)。我可以使用 ptrace 遍历堆栈并检索所有帧/基指针(RBP)值。但由于我想要IP值,RIP和RBP之间的算术和概念关系是什么。 我假设 RIP 值存储在 (RBP + 8) 位置,并且可以使用 ptrace PEEKDATA 读取它。我的假设正确吗?
i need some help on retrieving Instruction pointers(RIP) of a call stack on Linux 64 bit machine. i can traverse the Stack using ptrace and retrieve all Frame/Base pointer(RBP) values. but as i want IP values, what is the arithmetic and conceptual relationship between RIP and RBP. i assume that RIP value is stored at (RBP + 8) location and a can read it using ptrace PEEKDATA. is my assumption correct?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
压入堆栈的任何返回地址只会为您提供当前正在运行的函数返回后开始的
%rip
,而不是当前正在执行的函数的%rip
。您应该能够像 GDB 一样获取当前的%rip
:PTRACE_GETREGS
或PTRACE_GETREGSET
参数。您的联机帮助页和头文件应该可以帮助您完成剩下的工作。您可以在 GDB 源代码树中的
gdb/amd64-linux-nat.c
中查看详细信息。Any return address pushed on the stack will only get you the
%rip
starting after the currently running function returns, not the%rip
of the currently executing function. You should be able to get your hands on the current%rip
the same way GDB does:PTRACE_GETREGS
orPTRACE_GETREGSET
argument. Your manpage and the header file should get you the rest of the way from here.PTRACE_PEEKUSER
argument with the appropriate offset to grab the register from the user area.You can look at the gorey details in
gdb/amd64-linux-nat.c
in the GDB source tree.