Chinaunix首页 | 论坛 | 博客
  • 博客访问: 772008
  • 博文数量: 215
  • 博客积分: 291
  • 博客等级: 二等列兵
  • 技术积分: 1031
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-12 18:17
文章分类

全部博文(215)

文章存档

2016年(16)

2015年(16)

2014年(123)

2013年(60)

分类: LINUX

2014-05-15 13:15:57

原文地址:Linux 程序内存空间布局 作者:andyhzw

操作系统:ubuntu10.04

前言:
    在偏底层的开发中,需要了解程序的是如何存储的。

一,架构
一个典型的Linux C程序内存空间由如下几部分组成:
代码段(.text):这里存放的是CPU要执行的指令。代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段是只读的,防止程序由于错误而修改自身的指令。

初始化数据段(.data):这里存放的是程序中需要明确赋初始值的变量,例如位于所有函数之外的全局变量:int val=100。需要强调的是,以上两段都是位于程序的可执行文件中,内核在调用exec函数启动该程序时从源程序文件中读入。

未初始化数据段(.bss):位于这一段中的数据,内核在执行该程序前,将其初始化为0或者null。例如出现在任何函数之外的全局变量:int sum;

堆(Heap):这个段用于在程序中进行动态内存申请,例如经常用到的malloc,new系列函数就是从这个段中申请内存。

栈(Stack):函数中的局部变量以及在函数调用过程中产生的临时变量都保存在此段中。





二,实例

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>


  3. int global_init_var = 84; //已初始化的全局变量
  4. int global_uninit_var; //未初始化的全局变量
  5. char *str1 = "hello world!"; //字符串常量

  6. void func1(int i)
  7. {
  8.     printf("%d\n", i);
  9. }

  10. int main(void)
  11. {
  12.     static int static_var = 85; //已初始化的静态局部变量
  13.     static int static_var2; //未初始化的静态局部变量
  14.     char *str2 = "22222"; //字符串常量

  15.     int a = 1;
  16.     int b;

  17.     char *ptr_stack = NULL;
  18.     char *ptr_heap    = NULL;

  19.     ptr_stack = alloca(100);
  20.     printf("ptr_stack : %p\n",ptr_stack);
  21.     printf("a : %p\n",&a);
  22.     printf("b : %p\n",&b);

  23.     ptr_heap = malloc(100);
  24.     printf("ptr_heap : %p\n",ptr_heap);
  25.     free(ptr_heap);

  26.     printf("static_var : %p\n",&static_var);    
  27.     printf("global_init_var : %p\n",&global_init_var);    
  28.     printf("global_uninit_var : %p\n",&global_uninit_var);
  29.     printf("static_var2 : %p\n",&static_var2);
  30.     printf("str2 : %p\n",str2);
  31.     printf("str1 : %p\n",str1);
  32.     
  33.     
  34.     func1(static_var+static_var2+a+b);

  35.     return a;
  36. }
    #gcc memory.c -o m
    #objdump -d m > m.dis

点击(此处)折叠或打开

  1. m: file format elf32-i386


  2. Disassembly of section .init:

  3. 0804834c <_init>:
  4.  804834c:    55     push %ebp
  5.  804834d:    89 e5     mov %esp,%ebp
  6.  804834f:    53     push %ebx
  7.  8048350:    83 ec 04     sub $0x4,%esp
  8.  8048353:    e8 00 00 00 00     call 8048358 <_init+0xc>
  9.  8048358:    5b     pop %ebx
  10.  8048359:    81 c3 9c 1c 00 00     add $0x1c9c,%ebx
  11.  804835f:    8b 93 fc ff ff ff     mov -0x4(%ebx),%edx
  12.  8048365:    85 d2     test %edx,%edx
  13.  8048367:    74 05     je 804836e <_init+0x22>
  14.  8048369:    e8 1e 00 00 00     call 804838c <__gmon_start__@plt>
  15.  804836e:    e8 0d 01 00 00     call 8048480 <frame_dummy>
  16.  8048373:    e8 88 02 00 00     call 8048600 <__do_global_ctors_aux>
  17.  8048378:    58     pop %eax
  18.  8048379:    5b     pop %ebx
  19.  804837a:    c9     leave
  20.  804837b:    c3     ret

  21. Disassembly of section .plt:

  22. 0804837c <__gmon_start__@plt-0x10>:
  23.  804837c:    ff 35 f8 9f 04 08     pushl 0x8049ff8
  24.  8048382:    ff 25 fc 9f 04 08     jmp *0x8049ffc
  25.  8048388:    00 00     add %al,(%eax)
  26.     ...

  27. 0804838c <__gmon_start__@plt>:
  28.  804838c:    ff 25 00 a0 04 08     jmp *0x804a000
  29.  8048392:    68 00 00 00 00     push $0x0
  30.  8048397:    e9 e0 ff ff ff     jmp 804837c <_init+0x30>

  31. 0804839c <__libc_start_main@plt>:
  32.  804839c:    ff 25 04 a0 04 08     jmp *0x804a004
  33.  80483a2:    68 08 00 00 00     push $0x8
  34.  80483a7:    e9 d0 ff ff ff     jmp 804837c <_init+0x30>

  35. 080483ac <free@plt>:
  36.  80483ac:    ff 25 08 a0 04 08     jmp *0x804a008
  37.  80483b2:    68 10 00 00 00     push $0x10
  38.  80483b7:    e9 c0 ff ff ff     jmp 804837c <_init+0x30>

  39. 080483bc <printf@plt>:
  40.  80483bc:    ff 25 0c a0 04 08     jmp *0x804a00c
  41.  80483c2:    68 18 00 00 00     push $0x18
  42.  80483c7:    e9 b0 ff ff ff     jmp 804837c <_init+0x30>

  43. 080483cc <malloc@plt>:
  44.  80483cc:    ff 25 10 a0 04 08     jmp *0x804a010
  45.  80483d2:    68 20 00 00 00     push $0x20
  46.  80483d7:    e9 a0 ff ff ff     jmp 804837c <_init+0x30>

  47. 080483dc <__stack_chk_fail@plt>:
  48.  80483dc:    ff 25 14 a0 04 08     jmp *0x804a014
  49.  80483e2:    68 28 00 00 00     push $0x28
  50.  80483e7:    e9 90 ff ff ff     jmp 804837c <_init+0x30>

  51. Disassembly of section .text:

  52. 080483f0 <_start>:
  53.  80483f0:    31 ed     xor %ebp,%ebp
  54.  80483f2:    5e     pop %esi
  55.  80483f3:    89 e1     mov %esp,%ecx
  56.  80483f5:    83 e4 f0     and $0xfffffff0,%esp
  57.  80483f8:    50     push %eax
  58.  80483f9:    54     push %esp
  59.  80483fa:    52     push %edx
  60.  80483fb:    68 90 85 04 08     push $0x8048590
  61.  8048400:    68 a0 85 04 08     push $0x80485a0
  62.  8048405:    51     push %ecx
  63.  8048406:    56     push %esi
  64.  8048407:    68 c0 84 04 08     push $0x80484c0
  65.  804840c:    e8 8b ff ff ff     call 804839c <__libc_start_main@plt>
  66.  8048411:    f4     hlt
  67.  8048412:    90     nop
  68.  8048413:    90     nop
  69.  8048414:    90     nop
  70.  8048415:    90     nop
  71.  8048416:    90     nop
  72.  8048417:    90     nop
  73.  8048418:    90     nop
  74.  8048419:    90     nop
  75.  804841a:    90     nop
  76.  804841b:    90     nop
  77.  804841c:    90     nop
  78.  804841d:    90     nop
  79.  804841e:    90     nop
  80.  804841f:    90     nop

  81. 08048420 <__do_global_dtors_aux>:
  82.  8048420:    55     push %ebp
  83.  8048421:    89 e5     mov %esp,%ebp
  84.  8048423:    53     push %ebx
  85.  8048424:    83 ec 04     sub $0x4,%esp
  86.  8048427:    80 3d 2c a0 04 08 00     cmpb $0x0,0x804a02c
  87.  804842e:    75 3f     jne 804846f <__do_global_dtors_aux+0x4f>
  88.  8048430:    a1 30 a0 04 08     mov 0x804a030,%eax
  89.  8048435:    bb 18 9f 04 08     mov $0x8049f18,%ebx
  90.  804843a:    81 eb 14 9f 04 08     sub $0x8049f14,%ebx
  91.  8048440:    c1 fb 02     sar $0x2,%ebx
  92.  8048443:    83 eb 01     sub $0x1,%ebx
  93.  8048446:    39 d8     cmp %ebx,%eax
  94.  8048448:    73 1e     jae 8048468 <__do_global_dtors_aux+0x48>
  95.  804844a:    8d b6 00 00 00 00     lea 0x0(%esi),%esi
  96.  8048450:    83 c0 01     add $0x1,%eax
  97.  8048453:    a3 30 a0 04 08     mov %eax,0x804a030
  98.  8048458:    ff 14 85 14 9f 04 08     call *0x8049f14(,%eax,4)
  99.  804845f:    a1 30 a0 04 08     mov 0x804a030,%eax
  100.  8048464:    39 d8     cmp %ebx,%eax
  101.  8048466:    72 e8     jb 8048450 <__do_global_dtors_aux+0x30>
  102.  8048468:    c6 05 2c a0 04 08 01     movb $0x1,0x804a02c
  103.  804846f:    83 c4 04     add $0x4,%esp
  104.  8048472:    5b     pop %ebx
  105.  8048473:    5d     pop %ebp
  106.  8048474:    c3     ret
  107.  8048475:    8d 74 26 00     lea 0x0(%esi,%eiz,1),%esi
  108.  8048479:    8d bc 27 00 00 00 00     lea 0x0(%edi,%eiz,1),%edi

  109. 08048480 <frame_dummy>:
  110.  8048480:    55     push %ebp
  111.  8048481:    89 e5     mov %esp,%ebp
  112.  8048483:    83 ec 18     sub $0x18,%esp
  113.  8048486:    a1 1c 9f 04 08     mov 0x8049f1c,%eax
  114.  804848b:    85 c0     test %eax,%eax
  115.  804848d:    74 12     je 80484a1 <frame_dummy+0x21>
  116.  804848f:    b8 00 00 00 00     mov $0x0,%eax
  117.  8048494:    85 c0     test %eax,%eax
  118.  8048496:    74 09     je 80484a1 <frame_dummy+0x21>
  119.  8048498:    c7 04 24 1c 9f 04 08     movl $0x8049f1c,(%esp)
  120.  804849f:    ff d0     call *%eax
  121.  80484a1:    c9     leave
  122.  80484a2:    c3     ret
  123.  80484a3:    90     nop

  124. 080484a4 <func1>:
  125.  80484a4:    55     push %ebp
  126.  80484a5:    89 e5     mov %esp,%ebp
  127.  80484a7:    83 ec 18     sub $0x18,%esp
  128.  80484aa:    b8 5d 86 04 08     mov $0x804865d,%eax
  129.  80484af:    8b 55 08     mov 0x8(%ebp),%edx
  130.  80484b2:    89 54 24 04     mov %edx,0x4(%esp)
  131.  80484b6:    89 04 24     mov %eax,(%esp)
  132.  80484b9:    e8 fe fe ff ff     call 80483bc <printf@plt>
  133.  80484be:    c9     leave
  134.  80484bf:    c3     ret

  135. 080484c0 <main>:
  136.  80484c0:    8d 4c 24 04     lea 0x4(%esp),%ecx
  137.  80484c4:    83 e4 f0     and $0xfffffff0,%esp
  138.  80484c7:    ff 71 fc     pushl -0x4(%ecx)
  139.  80484ca:    55     push %ebp
  140.  80484cb:    89 e5     mov %esp,%ebp
  141.  80484cd:    51     push %ecx
  142.  80484ce:    83 ec 34     sub $0x34,%esp
  143.  80484d1:    65 a1 14 00 00 00     mov %gs:0x14,%eax
  144.  80484d7:    89 45 f4     mov %eax,-0xc(%ebp)
  145.  80484da:    31 c0     xor %eax,%eax
  146.  80484dc:    c7 45 f0 61 86 04 08     movl $0x8048661,-0x10(%ebp)
  147.  80484e3:    c7 45 ec 01 00 00 00     movl $0x1,-0x14(%ebp)
  148.  80484ea:    c7 45 e4 00 00 00 00     movl $0x0,-0x1c(%ebp)
  149.  80484f1:    c7 45 e0 00 00 00 00     movl $0x0,-0x20(%ebp)
  150.  80484f8:    83 c4 80     add $0xffffff80,%esp
  151.  80484fb:    8d 44 24 08     lea 0x8(%esp),%eax
  152.  80484ff:    83 c0 0f     add $0xf,%eax
  153.  8048502:    c1 e8 04     shr $0x4,%eax
  154.  8048505:    c1 e0 04     shl $0x4,%eax
  155.  8048508:    89 45 e4     mov %eax,-0x1c(%ebp)
  156.  804850b:    b8 67 86 04 08     mov $0x8048667,%eax
  157.  8048510:    8b 55 e4     mov -0x1c(%ebp),%edx
  158.  8048513:    89 54 24 04     mov %edx,0x4(%esp)
  159.  8048517:    89 04 24     mov %eax,(%esp)
  160.  804851a:    e8 9d fe ff ff     call 80483bc <printf@plt>
  161.  804851f:    c7 04 24 64 00 00 00     movl $0x64,(%esp)
  162.  8048526:    e8 a1 fe ff ff     call 80483cc <malloc@plt>
  163.  804852b:    89 45 e0     mov %eax,-0x20(%ebp)
  164.  804852e:    b8 77 86 04 08     mov $0x8048677,%eax
  165.  8048533:    8b 55 e0     mov -0x20(%ebp),%edx
  166.  8048536:    89 54 24 04     mov %edx,0x4(%esp)
  167.  804853a:    89 04 24     mov %eax,(%esp)
  168.  804853d:    e8 7a fe ff ff     call 80483bc <printf@plt>
  169.  8048542:    8b 45 e0     mov -0x20(%ebp),%eax
  170.  8048545:    89 04 24     mov %eax,(%esp)
  171.  8048548:    e8 5f fe ff ff     call 80483ac <free@plt>
  172.  804854d:    8b 15 28 a0 04 08     mov 0x804a028,%edx
  173.  8048553:    a1 34 a0 04 08     mov 0x804a034,%eax
  174.  8048558:    8d 04 02     lea (%edx,%eax,1),%eax
  175.  804855b:    03 45 ec     add -0x14(%ebp),%eax
  176.  804855e:    03 45 e8     add -0x18(%ebp),%eax
  177.  8048561:    89 04 24     mov %eax,(%esp)
  178.  8048564:    e8 3b ff ff ff     call 80484a4 <func1>
  179.  8048569:    8b 45 ec     mov -0x14(%ebp),%eax
  180.  804856c:    8b 55 f4     mov -0xc(%ebp),%edx
  181.  804856f:    65 33 15 14 00 00 00     xor %gs:0x14,%edx
  182.  8048576:    74 05     je 804857d <main+0xbd>
  183.  8048578:    e8 5f fe ff ff     call 80483dc <__stack_chk_fail@plt>
  184.  804857d:    8b 4d fc     mov -0x4(%ebp),%ecx
  185.  8048580:    c9     leave
  186.  8048581:    8d 61 fc     lea -0x4(%ecx),%esp
  187.  8048584:    c3     ret
  188.  8048585:    90     nop
  189.  8048586:    90     nop
  190.  8048587:    90     nop
  191.  8048588:    90     nop
  192.  8048589:    90     nop
  193.  804858a:    90     nop
  194.  804858b:    90     nop
  195.  804858c:    90     nop
  196.  804858d:    90     nop
  197.  804858e:    90     nop
  198.  804858f:    90     nop

  199. 08048590 <__libc_csu_fini>:
  200.  8048590:    55     push %ebp
  201.  8048591:    89 e5     mov %esp,%ebp
  202.  8048593:    5d     pop %ebp
  203.  8048594:    c3     ret
  204.  8048595:    8d 74 26 00     lea 0x0(%esi,%eiz,1),%esi
  205.  8048599:    8d bc 27 00 00 00 00     lea 0x0(%edi,%eiz,1),%edi

  206. 080485a0 <__libc_csu_init>:
  207.  80485a0:    55     push %ebp
  208.  80485a1:    89 e5     mov %esp,%ebp
  209.  80485a3:    57     push %edi
  210.  80485a4:    56     push %esi
  211.  80485a5:    53     push %ebx
  212.  80485a6:    e8 4f 00 00 00     call 80485fa <__i686.get_pc_thunk.bx>
  213.  80485ab:    81 c3 49 1a 00 00     add $0x1a49,%ebx
  214.  80485b1:    83 ec 1c     sub $0x1c,%esp
  215.  80485b4:    e8 93 fd ff ff     call 804834c <_init>
  216.  80485b9:    8d bb 18 ff ff ff     lea -0xe8(%ebx),%edi
  217.  80485bf:    8d 83 18 ff ff ff     lea -0xe8(%ebx),%eax
  218.  80485c5:    29 c7     sub %eax,%edi
  219.  80485c7:    c1 ff 02     sar $0x2,%edi
  220.  80485ca:    85 ff     test %edi,%edi
  221.  80485cc:    74 24     je 80485f2 <__libc_csu_init+0x52>
  222.  80485ce:    31 f6     xor %esi,%esi
  223.  80485d0:    8b 45 10     mov 0x10(%ebp),%eax
  224.  80485d3:    89 44 24 08     mov %eax,0x8(%esp)
  225.  80485d7:    8b 45 0c     mov 0xc(%ebp),%eax
  226.  80485da:    89 44 24 04     mov %eax,0x4(%esp)
  227.  80485de:    8b 45 08     mov 0x8(%ebp),%eax
  228.  80485e1:    89 04 24     mov %eax,(%esp)
  229.  80485e4:    ff 94 b3 18 ff ff ff     call *-0xe8(%ebx,%esi,4)
  230.  80485eb:    83 c6 01     add $0x1,%esi
  231.  80485ee:    39 fe     cmp %edi,%esi
  232.  80485f0:    72 de     jb 80485d0 <__libc_csu_init+0x30>
  233.  80485f2:    83 c4 1c     add $0x1c,%esp
  234.  80485f5:    5b     pop %ebx
  235.  80485f6:    5e     pop %esi
  236.  80485f7:    5f     pop %edi
  237.  80485f8:    5d     pop %ebp
  238.  80485f9:    c3     ret

  239. 080485fa <__i686.get_pc_thunk.bx>:
  240.  80485fa:    8b 1c 24     mov (%esp),%ebx
  241.  80485fd:    c3     ret
  242.  80485fe:    90     nop
  243.  80485ff:    90     nop

  244. 08048600 <__do_global_ctors_aux>:
  245.  8048600:    55     push %ebp
  246.  8048601:    89 e5     mov %esp,%ebp
  247.  8048603:    53     push %ebx
  248.  8048604:    83 ec 04     sub $0x4,%esp
  249.  8048607:    a1 0c 9f 04 08     mov 0x8049f0c,%eax
  250.  804860c:    83 f8 ff     cmp $0xffffffff,%eax
  251.  804860f:    74 13     je 8048624 <__do_global_ctors_aux+0x24>
  252.  8048611:    bb 0c 9f 04 08     mov $0x8049f0c,%ebx
  253.  8048616:    66 90     xchg %ax,%ax
  254.  8048618:    83 eb 04     sub $0x4,%ebx
  255.  804861b:    ff d0     call *%eax
  256.  804861d:    8b 03     mov (%ebx),%eax
  257.  804861f:    83 f8 ff     cmp $0xffffffff,%eax
  258.  8048622:    75 f4     jne 8048618 <__do_global_ctors_aux+0x18>
  259.  8048624:    83 c4 04     add $0x4,%esp
  260.  8048627:    5b     pop %ebx
  261.  8048628:    5d     pop %ebp
  262.  8048629:    c3     ret
  263.  804862a:    90     nop
  264.  804862b:    90     nop

  265. Disassembly of section .fini:

  266. 0804862c <_fini>:
  267.  804862c:    55     push %ebp
  268.  804862d:    89 e5     mov %esp,%ebp
  269.  804862f:    53     push %ebx
  270.  8048630:    83 ec 04     sub $0x4,%esp
  271.  8048633:    e8 00 00 00 00     call 8048638 <_fini+0xc>
  272.  8048638:    5b     pop %ebx
  273.  8048639:    81 c3 bc 19 00 00     add $0x19bc,%ebx
  274.  804863f:    e8 dc fd ff ff     call 8048420 <__do_global_dtors_aux>
  275.  8048644:    59     pop %ecx
  276.  8048645:    5b     pop %ebx
  277.  8048646:    c9     leave
  278.  8048647:    c3     ret
执行结果:




三,参考文件
1,http://blog.chinaunix.net/uid-27018250-id-3867588.html
2,http://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/








阅读(622) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~