x64栈unwind和检查RIP是否在epilog中
x64 stack unwinding and checking if the RIP is in the epilog
我想unwind一个x64调用栈,所以我试图遵循我在这里找到的" unwind过程":
http://msdn.microsoft.com/en-us/library/8ydc79k6.aspx
我明白如果RIP在epilog中,我们需要计算RSP的偏移量,考虑到仍然需要做的操作,但是我不清楚如何找出RIP是否在epilog中(在第3.a节中)?
有人能给我解释一下吗?(链接或代码示例也将非常感谢)
来自Unwind过程
确定RIP是否在epilog中,来自RIP的代码流On被检查。如果该码流可以与尾随的合法epilog的一部分,如章节所述CNDJ6nn5us4RjIIAqgBLqQsCAAAACAAAAA4AAABfAFIAZQBmADQAOQA2ADAAOQAyADQAMgA1AAAAREF _Ref496092425 r h 0,则它在epilog中,其余的模拟epilog的一部分,并将上下文记录更新为每条指令被处理
,以及Prolog和Epilog(为了更好地理解,我推荐整篇文章)
这些是尾声的唯一合法形式。它必须包含add RSP,constant或lea RSP,constant[FPReg],后面跟着a一系列的零个或多个8字节寄存器弹出和返回或跳转。(epilog中只允许使用jmp语句的一个子集。[…])。不能出现其他代码。特别是,没有什么是可以的在epilog中调度,包括加载返回值。
注意,当不使用帧指针时,epilog必须使用addRSP,用于释放堆栈中固定部分的常量。它可能不使用lea RSP,constant[RSP]代替。这个限制存在,所以unwind在搜索epilog时,代码需要识别的模式更少。
如果代码发现自己处于这种情况,它就会检查当前执行的代码是否符合这些特定指令,如果匹配,则认为自己在epilog中。
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- C/C++预处理器是否可以检测一些编译器选项
- x64栈unwind和检查RIP是否在epilog中