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

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

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

先看一下例子:

  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	 }

汇编代码:

(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<[email protected]>

  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<[email protected]>

  0x080485e4 <+68>:   leave 

  0x080485e5 <+69>:   ret    

End of assembler dump.

其中这段指令

   0x080485a9 <+9>:     lea    0x1f(%esp),%eax
   0x080485ad <+13>:    mov    %eax,0x4(%esp)
   0x080485b1 <+17>:    movl   $0x80486c3,(%esp)
   0x080485b8 <+24>:    call   0x8048460 <[email protected]>

是对应

18	     printf( "address of test:%p\n", &test );

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

由这两段指令,

   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指针。

时间: 2024-11-10 07:28:09

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

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

上面一节已经探究出this指针的辨别,由this指针就可以看到类的内容.在这里,就由this指针来看一下类的成员变量是如何排列. 先看一个例子 1 #include <stdio.h> 2 class xuzhina_dump_c06_s2 3 { 4 private: 5 short m_c; 6 char m_d; 7 int m_e; 8 9 public: 10 xuzhina_dump_c06_s2( int a, int b ) 11 { 12 m_c = (short)(a +

《coredump问题原理探究》Linux x86版5.8节C风格数据结构内存布局之联合体

在C语言中,联合体(union)有点像结构体那样,把不同类型的数据组织起来,但和结构体不大一样,在结构体各成员有各自的内存空间,一个结构体对象的总长度是各成员长度之和.而在联合体中,各成员共享一段内存空间,一个联合体对象的长度等于各成员中最长的长度. 由上面描述可知,联合体应该具备多面性,即在汇编层面上,有时候会显示结构体的特征,或数组特征,或其它基本数据类型特征. 先看一下例子: 1 #include <stdio.h> 2 union xuzhina_dump_c05_s4 3 { 4 i

《coredump问题原理探究》Windows版 笔记

<coredump问题原理探究>Windows版 笔记 Debug 一.环境搭建 1.Win7捕获程序dump 2.Windbg符号表设置(Symbols Search Path) 二.WinDbg命令 三.函数栈帧 1.栈内存布局 2.栈溢出 3.栈的规律 4.定位栈溢出问题的经验方法 四.函数逆向 五.C内存布局 1.基本类型 2.数组类型 3.结构体 六.C++内存布局 1.类的内存布局 2.this指针 3.虚函数表及虚表指针 4.单继承 5.多继承(无公共基类) 七.STL容器内存布

《coredump问题原理探究》Linux x86版6.3节有成员变量的类coredump例子

在探究完类成员变量分布后,来定位一个coredump例子来实践一把: (gdb) bt #0 0x0804863c in xuzhina_dump_c06_s2_ex::print() () #1 0x08048713 in main () 看一下xuzhina_dump_c06_s2_ex::print的汇编: (gdb) disassemble 0x0804863c Dump of assembler code for function _ZN22xuzhina_dump_c06_s2_ex

《coredump问题原理探究》Linux x86版6.8节多继承coredump例子

下面看一个coredump的例子: (gdb) bt #0 0x08048662 in xuzhina_dump_c06_s5_ex_child::inheritFrom(char*, int) () #1 0x08048609 in main () 先看一下xuzhina_dump_c06_s5_ex_child::inheritFrom的汇编: (gdb) disassemble 0x08048662 Dump of assembler code for function _ZN28xuzh

《coredump问题原理探究》Linux x86版6.4节虚函数

在上一节已经探究了类的成员变量的排列,现在看一下虚函数表和成员变量的排列及虚函数之间的排列. 先看一个例子: 1 #include <stdio.h> 2 class xuzhina_dump_c06_s3 3 { 4 private: 5 int m_a; 6 public: 7 xuzhina_dump_c06_s3() { m_a = 0; } 8 virtual void inc() { m_a++; } 9 virtual void dec() { m_a--; } 10 virtu

《coredump问题原理探究》Linux x86版7.2节vector coredump例子

看一个coredump的例子: [[email protected] s1_ex]$ gdb xuzhina_dump_c07_s1_ex core.27776 GNU gdb (GDB) Red Hat Enterprise Linux (7.2-75.el6) Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses

《coredump问题原理探究》Linux x86版7.5节 Map对象

先看一个例子: 1 #include <map> 2 3 int main() 4 { 5 std::map<int,int> iMap; 6 7 iMap[5] = 6; 8 iMap[8] = 20; 9 iMap[2] = 80; 10 11 return 0; 12 } 看一下汇编: (gdb) disassemble main Dump of assembler code for function main: 0x080486e4 <+0>: push %eb

《coredump问题原理探究》Linux x86版7.4节List coredump例子

看一个coredump例子: 看一个coredump例子: Core was generated by `./xuzhina_dump_c07_s2_ex'. Program terminated with signal 11, Segmentation fault. #0 0x0285b9b7 in std::_List_node_base::hook(std::_List_node_base*) () from /usr/lib/libstdc++.so.6 Missing separate