首页
学习
活动
专区
圈层
工具
发布
21 篇文章
1
《coredump问题原理探究》Linux x86版6.3节有成员变量的类coredump例子
2
《coredump问题原理探究》Linux x86版6.5节虚函数的coredump例子
3
《coredump问题原理探究》Linux x86版6.8节多继承coredump例子
4
《coredump问题原理探究》Linux x86版7.2节vector coredump例子
5
《coredump问题原理探究》Linux x86版7.4节List coredump例子
6
《coredump问题原理探究》Linux x86版7.6节 Map coredump例子
7
《coredump问题原理探究》Linux x86版5.9节C风格数据结构内存布局之联合体
8
《coredump问题原理探究》Linux x86版6.1节C++风格数据结构内存布局之无成员变量的类
9
《coredump问题原理探究》Linux x86版6.2节C++风格数据结构内存布局之有成员变量的类
10
《coredump问题原理探究》Linux x86版4.5节函数的逆向之coredump例子
11
《coredump问题原理探究》Linux x86版5.1节C风格数据结构内存布局之引言
12
《coredump问题原理探究》Linux x86版5.2节C风格数据结构内存布局之基本数据类型
13
《coredump问题原理探究》Linux x86版5.3节C风格数据结构内存布局之数组
14
《coredump问题原理探究》Linux x86版5.4节C风格数据结构内存布局之数组coredump例子
15
《coredump问题原理探究》Linux x86版5.5节C风格数据结构内存布局之基本数据类型构成的结构体
16
《coredump问题原理探究》Linux x86版5.6节C风格数据结构内存布局之复合类型构成的结构体
17
《coredump问题原理探究》Linux x86版5.7节C风格数据结构内存布局之结构体数组
18
《coredump问题原理探究》Linux x86版5.8节C风格数据结构内存布局之结构体数组结构体coredump
19
《coredump问题原理探究》Linux x86版3.5节栈布局之-fomit-frame-pointer编译选项
20
《coredump问题原理探究》Linux x86版3.6节栈布局之gcc内嵌关键字
21
《coredump问题原理探究》Linux x86版3.8节栈布局之栈溢出coredump例子

《coredump问题原理探究》Linux x86版6.1节C++风格数据结构内存布局之无成员变量的类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1344520

在探究完C风格数据结构内存布局之后,接着探究C++风格数据结构内存布局。

虽然最简单的类是没有任何成员变量和成员函数,但由于没什么意义,不值得探究。在这里,就先探究一下没有任何成员变量和虚函数,只有成员函数的类。

先看一下例子:

代码语言:javascript
复制
  1	 #include <stdio.h>
  2	 class xuzhina_dump_c06_s1
  3	 {
  4	     public:
  5	         void hello()
  6	         {
  7	             printf( "hello\n" );
  8	         }
  9	         void print()
 10	         {
 11	             printf( "this:%p\n", this);
 12	         }
 13	 };
 14 
 15	 int main()
 16	 {
 17	     xuzhina_dump_c06_s1 test;
 18	     printf( "address of test:%p\n", &test );
 19	     test.print();
 20	     test.hello();
 21	     return 0;
 22	 }

汇编代码:

代码语言:javascript
复制
(gdb) disassemble main

Dump of assembler code for function main:

  0x080485a0 <+0>:    push   %ebp

  0x080485a1 <+1>:    mov    %esp,%ebp

  0x080485a3 <+3>:    and    $0xfffffff0,%esp

  0x080485a6 <+6>:    sub    $0x20,%esp

  0x080485a9 <+9>:    lea    0x1f(%esp),%eax

  0x080485ad <+13>:   mov    %eax,0x4(%esp)

  0x080485b1 <+17>:   movl   $0x80486c3,(%esp)

  0x080485b8 <+24>:   call   0x8048460<printf@plt>

  0x080485bd <+29>:   lea    0x1f(%esp),%eax

  0x080485c1 <+33>:   mov    %eax,(%esp)

  0x080485c4 <+36>:   call   0x80485fa<_ZN19xuzhina_dump_c06_s15printEv>

  0x080485c9 <+41>:   lea    0x1f(%esp),%eax

  0x080485cd <+45>:   mov    %eax,(%esp)

  0x080485d0 <+48>:   call   0x80485e6<_ZN19xuzhina_dump_c06_s15helloEv>

   0x080485d5 <+53>:    mov   $0x0,%eax

  0x080485da <+58>:   jmp    0x80485e4 <main+68>

  0x080485dc <+60>:   mov    %eax,(%esp)

  0x080485df <+63>:   call   0x8048490<_Unwind_Resume@plt>

  0x080485e4 <+68>:   leave 

  0x080485e5 <+69>:   ret    

End of assembler dump.

其中这段指令

代码语言:javascript
复制
   0x080485a9 <+9>:     lea    0x1f(%esp),%eax
   0x080485ad <+13>:    mov    %eax,0x4(%esp)
   0x080485b1 <+17>:    movl   $0x80486c3,(%esp)
   0x080485b8 <+24>:    call   0x8048460 <printf@plt>

是对应

代码语言:javascript
复制
18	     printf( "address of test:%p\n", &test );

也就是说,esp+0x1f放着是this指针。

由这两段指令,

代码语言:javascript
复制
   0x080485bd <+29>:    lea    0x1f(%esp),%eax
   0x080485c1 <+33>:    mov    %eax,(%esp)
   0x080485c4 <+36>:    call   0x80485fa <_ZN19xuzhina_dump_c06_s15printEv>

   0x080485c9 <+41>:    lea    0x1f(%esp),%eax
   0x080485cd <+45>:    mov    %eax,(%esp)
   0x080485d0 <+48>:    call   0x80485e6 <_ZN19xuzhina_dump_c06_s15helloEv>

可知一个对象在调用成员函数之前,都会把this指针作为成员函数的第一个参数。也就是说,类的成员函数默认都有参数,其中第一个参数就是对象的this指针。

下一篇
举报
领券