内容简介:目前为止我们知道在抛出一个异常时,通过阅读本地储存区,即.gcc_except_table,我们可以得到许多反射信息;读这个表我们已经能够实现能决定在抛出一个异常时运行哪个着陆垫的personality函数。我们还知道如何读LSDA的活动表部分,因此我们应该能够修改personality函数在带有多个catch的着陆垫内选择正确的catch语句。上次我们留下了我们的ABI实现,并把一些时间用于分析.gcc_except_table的汇编来发掘我们如何找出catch可以处理的类型。我们发现这张表的部分确实保存
作者: nicolasbrailo
目前为止我们知道在抛出一个异常时,通过阅读本地储存区,即.gcc_except_table,我们可以得到许多反射信息;读这个表我们已经能够实现能决定在抛出一个异常时运行哪个着陆垫的personality函数。我们还知道如何读LSDA的活动表部分,因此我们应该能够修改personality函数在带有多个catch的着陆垫内选择正确的catch语句。
上次我们留下了我们的ABI实现,并把一些时间用于分析.gcc_except_table的汇编来发掘我们如何找出catch可以处理的类型。我们发现这张表的部分确实保存了一个类型列表,可以找到这个消息。让我们尝试在清理阶段读它,但首先让我们回忆LSDA头的定义:
|
|
|
最后一个域是新的(对我们):它向我们给出了类型表的一个偏移。让我们回忆一下每个调用点的定义:
|
|
|
检查最后这个域“action”。这向我们给出活动表的一个偏移。这意味着我们可以对一个特定CS找到该活动。这里的技巧是对存在一个catch的着陆垫,这个活动将保存该类型表的偏移;我们可以使用类型表指针的偏移,这我们可以从头部获得。相当拗口:让我们更好地讨论代码:
|
|
|
代码看起来复杂,因为在到达结构体type_info之前有几层间接层,不过这并不复杂:它只是读我们在汇编里找到的.gcc_except_table。
打印类型名是正确方向上前进的一大步。同样,我们的personality函数变得有点混乱。读LSDA的大部分复杂性可以隐藏在底下,几乎没有代价。你可以在这里检查 我的实现 。
下次我们将看看是否能把新发现的类型匹配到原有的异常。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Fortran95程序设计
彭国伦 / 中国电力出版社 / 2002-9 / 59.00元
本书介绍了当前国际上广泛流行的高级算法语言Fortran的全新版本Fortran 95。 本书循序渐进、由浅到深,使用结构化及面向对象程序设计观念,以简捷明了的方式把Fortran 95介绍给读者。书中主要讲述了Fortran 95程序设计的方法,包括数值计算、计算机绘图、窗口程序设计、与Visual C/Visual Basic/Delphi的链接、甚至是游戏程序的编写。 本书语言简洁,实......一起来看看 《Fortran95程序设计》 这本书的介绍吧!