RTTI记录

0x00 背景

该文仅作为一个memo,没什么实质内容。

0x01 RTTI

假设有这样的cpp文件:

//rtti.cpp
#include <iostream>

class A {
public:
    virtual void func1(){std::cout << "A::func1()"<< std::endl;}
    virtual void func2(){std::cout << "A::func2()"<< std::endl;}
};

class B: public A {
public:
    virtual void func1(){std::cout << "B::func1()"<< std::endl;}
    virtual void func2(){std::cout << "B::func2()"<< std::endl;}
};

int main()
{
    A *a = new B();
    B *b = new B();
    a->func1();
    std::cout << typeid(a).name() << std::endl;
    std::cout << typeid(b).name() << std::endl;
    return 0;
}

用这个命令编译:clang++ rtti.cpp。我们可以看到ida中的类的内存构造:

在类的vtable中,第一个虚函数前面多了一项typeinfo。这就是rtti信息。

而如果disable rtti再进行编译的话:clang++ -fno-rtti rtti.cpp(此时typeid无法使用,需要注释掉),类的vtable构造如下:

发现vtable前空了16个字节,第一个虚函数前没有了typeinfo。