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。