免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2096 | 回复: 3

[C++] llvm 编译的程序,vtable有啥不一样么。。访问vtable,程序core了。 [复制链接]

论坛徽章:
0
发表于 2013-06-10 14:55 |显示全部楼层
              
$ ls -la /usr/bin/g++
lrwxr-xr-x  1 root  wheel  12 Mar 17 15:01 /usr/bin/g++ -> llvm-g++-4.2
$ ls
data_size                        data_size.cpp                        data_size.cpp.002t.class
$ vim data_size.cpp

    public:
        void self(){
            cout<<"is Y"<<endl;
        }
};
class Z : public virtual X {
    public:
        void bself(){
            cout<<"is Z"<<endl;
        }
};
class A : public Y, public Z {};

typedef void (*pfun)();
typedef void (Y::*afun)();

int main()
{
    X *x=new X();
    Y *y=new Y();
    A *a=new A();
    Z *z=new Z();
    //y->self();
    A b;

    pfun f;
    long long *vtable=(long long*)&b;
    f=(pfun)(*vtable);
    f();
    //afun af;
    //af = Y::self;
    //af();
    //-fdump-class-hierarchy
    cout<<"sizeof X:"<<sizeof(class X)<<":"<<((void***)x)[0] <<endl;
    cout<<"sizeof Y:"<<sizeof(class Y)<<":"<<((void***)y)[0]<<endl;
    cout<<"sizeof Z:"<<sizeof(class Z)<<":"<<((void***)z)[0]<<endl;
    cout<<"sizeof A:"<<sizeof(class A)<<":"<<((void***)a)[0][2]<<":"<<((void***)a)[0][3]<<endl;
    //f = &a->self;
    //f();
    //f = (pfun)*((int*)*(int*)(&b));
    //f();
    void ***p = (void***)y;
    f = (pfun)(p[0][1]);
    f();
    f = (pfun)(p[0][2]);
    f();
    f = (pfun)(p[0][0]);
    f();
    f = (pfun)(p[1][1]);
    f();
}

论坛徽章:
0
发表于 2013-06-10 14:57 |显示全部楼层


Class Z
   size=8 align=8
   base size=8 base align=8
Z (0x101d4bd20) 0 nearly-empty
    vptridx=0u vptr=((& Z::_ZTV1Z) + 24u)
  X (0x101d4bd90) 0 empty virtual
      vbaseoffset=-0x00000000000000018

Vtable for A
A::_ZTV1A: 6u entries
0     0u
8     (int (*)(...))0
16    (int (*)(...))(& _ZTI1A)
24    -8u
32    (int (*)(...))-0x00000000000000008
40    (int (*)(...))(& _ZTI1A)

Construction vtable for Y (0x101d4bee0 instance) in A
A::_ZTC1A0_1Y: 3u entries
0     0u
8     (int (*)(...))0
16    (int (*)(...))(& _ZTI1Y)

Construction vtable for Z (0x101d4b380 instance) in A
A::_ZTC1A8_1Z: 3u entries
0     -8u
8     (int (*)(...))0
16    (int (*)(...))(& _ZTI1Z)

VTT for A
A::_ZTT1A: 4u entries
0     ((& A::_ZTV1A) + 24u)
8     ((& A::_ZTC1A0_1Y) + 24u)
16    ((& A::_ZTC1A8_1Z) + 24u)
24    ((& A::_ZTV1A) + 48u)

Class A
   size=16 align=8
   base size=16 base align=8
A (0x101d89300) 0
    vptridx=0u vptr=((& A::_ZTV1A) + 24u)
  Y (0x101d4bee0) 0 nearly-empty
      primary-for A (0x101d89300)
      subvttidx=8u
    X (0x101d4bf50) 0 empty virtual
        vbaseoffset=-0x00000000000000018
  Z (0x101d4b380) 8 nearly-empty
      subvttidx=16u vptridx=24u vptr=((& A::_ZTV1A) + 48u)
    X (0x101d4bf50) alternative-path

g++ -o data_size data_size.cpp  -Wall -fdump-class-hierarchy 生成的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-06-10 15:05 |显示全部楼层
写程序要走正道,
优秀的程序员,大概都有几年走火入魔的时候

论坛徽章:
1
金牛座
日期:2013-10-10 22:06:28
发表于 2013-06-10 15:33 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP