在看雪学院的 <<逆向C++>>一文中偶尔看到说VC6.0 以上的编译器支持一个d1reportAllClassLayout的开关, 可以输出所有对象的内存布局信息, 心想我不知道多少次查看过 cl /?的输出, 没印象这个玩艺儿呀, 打开cmd窗口, 弄了个例子程序, 一试不爽.
小例子程序如下:
struct Foo
{
int i;
char c;
};
int main()
{
Foo f;
f.i = 5;
return 0;
}
这个开关输出了包括Foo结构在内, 主要是一大堆编译器内部的结构的内存布局, 其实还有一个开关是
d1reportSingleClassLayout
用起来是这样:
cl -d1reportSingleClassLayoutFoo test.cpp
切切注意, Layout跟指定的结构/类名Foo之间没有空格, 有空格就不对了. 这会只输出指定的结构的内存布局.
遗憾的是, 不能多次指定 -d1reportSingleClassLayout以输出多个自定义的结构的内存布局. 而且也不支持通配符*之类.
在google里搜了一下, msvc hidden switch, 本想顺藤摸瓜找出MSVC支持的所有隐藏开关, 没发现什么其它的.
在VS测试小组Andy Rich的blog中, 说这样的选项未经公布, 也没做测试, 使用者责任自负. 呵呵, 这是当然. 不论如何, 有这个总比没有好.
下面看看对包含了虚函数的类的输出:
|
不光给出了对象布局开关处的vfptr指针, 而且连带的输出了Foo对象的vtable. 最后的那个this adjustor是什么? 估计是多重继承时如何调整this指针的一个偏移量. 放在这, 估计日后用得着.