MSVC上的虚拟表格布局 - 哪里是类型信息?

时间:2014-03-08 01:40:47

标签: c++ polymorphism vtable virtual-method

我有以下用于说明虚拟方法的C ++代码:

class X{
    O a;
    H b;
    virtual void c() = 0;
    virtual void d() = 0;
};

class Y : public X{
    virtual void c();
    virtual void d();
};

在MSVC上输出以下vtable布局:

1>  class X size(24):
1>      +---
1>   0  | {vfptr}
1>   8  | a
1>  16  | b
1>      +---
1>  
1>  X::$vftable@:
1>      | &X_meta
1>      |  0
1>   0  | &X::c
1>   1  | &X::d
1>  
1>  X::c this adjustor: 0
1>  X::d this adjustor: 0
1>  
1>  
1>  class Y size(24):
1>      +---
1>      | +--- (base class X)
1>   0  | | {vfptr}
1>   8  | | a
1>  16  | | b
1>      | +---
1>      +---
1>  
1>  Y::$vftable@:
1>      | &Y_meta
1>      |  0
1>   0  | &Y::c
1>   1  | &Y::d
1>  
1>  Y::c this adjustor: 0
1>  Y::d this adjustor: 0
1>  
1>  

阅读C ++对象模型内部后,我想知道上面的vtable布局中的类型信息是什么?

在书中(我认为他们使用GCC vtable布局),类型信息将在vtable的第0个元素中。对于MSVC而言,这不是一个虚拟函数 - 所以存储的类型信息在哪里?这是"_meta"是什么?

2 个答案:

答案 0 :(得分:5)

  

这就是“_meta”是什么?

是。除了多态元数据之外,您认为这意味着什么?

答案 1 :(得分:3)

对于MSC,您会发现在RTTICompleteObjectLocator上搜索更多信息很有用,这些信息没有完全记录,但看起来大致如下:

struct RTTICompleteObjectLocator
{
    DWORD signature;
    DWORD offset;
    DWORD cdOffset;
    struct TypeDescriptor*;
    struct RTTIClassHierarchyDescriptor*;
};

它确实位于vtable附近,因此可以通过生成的组件中的指针调整轻松定位。

<子> 这是我在书签中保存了几年的来源:P. Sabanal, M.Yason. Reversing C++, Black Hat DC 2007