如何从机器代码中恢复C++尝试/抛出/捕获块长度和地址

How to recover the C++ try/throw/catch block length and address from machine code?

本文关键字:抛出 地址 尝试 机器 代码 C++ 恢复      更新时间:2023-10-16

我正在做一个项目,该项目在运行时对函数内的基本块进行重新排序,C++ 在 64 位 Linux 下。当然,重新排序过程包括更新"jmp"等指令。一个问题是,如果(我猜)编译器(clang++ 或 g++)使用范围确定 try{...} 块,即从地址 1 到 address2;重新排序的代码会有问题(一些基本块被移出范围,一些新的基本块被交换)。

我的问题是:编译器/程序是否使用范围确定try{...}块?如果是这样,或者不是,我怎么知道和修改相应的行列式,通过这些行列式我可以恢复 try/throw/catch 块,并在重新排序后让程序正常执行;当程序已经加载到内存中时?

供参考,这是LLVM实现try-catch的相关文档。 G++做了一些非常相似的事情。

当你说范围时,我假设你认为编译器会假设从0x0010到0x0020的代码指令是代码,而从0x0020到0x0024的指令是针对 catch 块的。从LLVM规范来看,它不依赖于这样的假设。

编辑:

以下是有关 G++ 和 Clang 如何实现 try-catch 的更多实现内容

相关文章: