如何从机器代码中恢复C++尝试/抛出/捕获块长度和地址
How to recover the C++ try/throw/catch block length and address from machine code?
我正在做一个项目,该项目在运行时对函数内的基本块进行重新排序,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 的更多实现内容
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 从构造函数抛出异常时如何克服内存泄漏
- GCC对可能有效的代码抛出init list生存期警告
- 如何在文件和行号中抛出错误
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- cmath抛出错误C2062、C2059、C2143和C2447.cmath包含在矢量文件中
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 如何通过参数抛出错误消息
- 函数如何通知用户它基于函数原型抛出异常?
- 为什么 boost::interprocess::managed_shared_memory 在施工时会抛出 boost
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 有没有办法让编译器在我放置字符串而不是 nlohmann::json 对象时抛出错误?
- 编译器错误:destuctor 的更宽松的抛出说明符
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- CppSQLite 抛出"LNK2019: unresolved external symbol"错误
- 带有 NORM 的 ZeroMQ - 地址已在使用 错误被抛出在第二个 .bind() 上 - 为什么?
- 如何从机器代码中恢复C++尝试/抛出/捕获块长度和地址
- C++异常处理通过引用传递:抛出的地址与捕获的地址不同