欢迎来到天天文库
浏览记录
ID:19303221
大小:75.50 KB
页数:4页
时间:2018-09-22
《c++继承关系(含虚函数)内存结构分析》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C++继承关系(含虚函数)内存结构分析以及动态绑定的细节分析一.说明本文较为深入的研究C++的继承(含多重继承)情况下带虚函数时的实例内存结构,较为深入的剖析了继承实例间是如何组织的,以及动态绑定的实现细节。二.依据以下阐述的细节均依据VS2005生成的DEBUG模式程序在IDAPro5.2反编译所得,部分数据结构根据程序分析得出。三.术语说明对于以下将频繁用到的术语,我可能简写为如下classX:RTTI_COLx原语:classX:RTTICompleteObjectLocator{forx}classX:RTTI_CHD原语:classX:RTTIclassHierarchyDe
2、scriptorclassX:RTTI_BCD原语:classX:RTTIBaseclassDescriptor以上简写均采用单词首字母缩写,其中Derive表示派生类,x表示Derive的一个基类,classX表示以上任意类Derive:RTTI_COLxvirtualDerive::fun1(overwritebyderiveclass)forbaseAvirtualA::fun2(inheritfrombaseA)forbaseA......virtualfun(ifderiveownvirtualitslef)forderive*perhapsnot四.分析1.派生类内存分布及
3、虚表vfTableforbaseAdataofbaseAvfTableforbaseBdataofbaseBdataofDeriveitselfFigure1:派生类实例对象内存分布及虚表映射如上图,其中左部为派生类class的实例对象内存格局(继承来自A,B),其中第一项为baseA的虚表地址(A,B数据在class实例中布局顺序是按照Derive在声明时继承顺序决定的),从图中箭头可知baseA的虚表地址指向了一个数组,里面存放了Derive对应的虚函数地址:①首先存放重写过的baseA声明的的虚函数地址(如果虚函数是从基类继承过来的,那么虚表中存放的也是baseA中该函数地址)。
4、②然后存放Derive自己声明的虚函数(可能没有)。*注意:vfTable地址指向的虚表是从右边表格黄色以下位置开始,黄色以上是虚表附加信息,不为虚表所有,为本人IDAPro反汇编分析所得。其中Derive:RTTI_COLx是定位对象所使用的相关数据结构,其结构经反汇编如下:2.classX:RTTICompleteObjectLocator{forx}FieldLengthRemarkreserve_14notused,filledwith0x00offset_x4theoffsetofvfTable(forx)andthebaseaddressofclassXreserve_34
5、notused,filledwith0x00pTypeDescriptor4addressofclassX:RTTITypeDescriptorpHierarchyDescriptor4addressofclassX:RTTIclassHierarchyDescriptorFigure2:classX:RTTICompleteObjectLocator{forx}反汇编结构offset_x字段描述基类x在classX实例内存空间中的起始地址相对于classX基址的偏移(也就是x的vfTable字段在classX内存布局中的偏移)pHierarchyDescriptor字段存放class
6、X:RTTIclassHierarchyDescriptor结构的地址,该结构描述了Derive类的内存结构层次信息。***Remark:对于classX为派生类Derive情况时,该结构描述了基类x相对于Derive的信息,此时表格中所有classX均应以Derive替换;但是当classX为基类x情况时,该结构描述了基类自身的信息,此时表格中所有classX均应以x替换3.classX:RTTIclassHierarchyDescriptorFieldLengthRemarkreserve_14unknownreserve_24unknowndwArrayElemCount4the
7、countoftheelementinsidepBaseClassArraypBaseClassArray4addressofclassX:RTTIBaseclassArrayFigure3:classX:RTTIclassHierarchyDescriptor反汇编结构该结构详细描述了类实例中相关重要信息的的索引pBaseClassArray字段存放classX:RTTIBaseclassArray数组基址。dwArrayElemCount字
此文档下载收益归作者所有