# gcc -v
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

重点:

  代码中的内存分配, 地址从低到高: 代码段(RO, 保存函数代码) --> 只读数据段(RO, 保存常量) --> 数据段(RW, 已初始化并且初始值不为0的全局变量和静态变量) -->bss段(RW,  未初始化或者初始化为0的全局变量和静态变量).

  程序运行起来之后, 堆区和栈区的变量地址是动态分配的.

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3.  
  4. int global_ni; // .bss
  5. int global_iz = ; // .bss
  6.  
  7. int global_inz = ; // .data
  8.  
  9. const int global_const0 = ;
  10. const int global_const1 = ;
  11.  
  12. void function(void)
  13. {
  14. int local_fni;
  15. int local_finz = ;
  16. int local_fiz = ;
  17.  
  18. static int static_fni;
  19. static int static_finz = ;
  20. static int static_fiz = ;
  21.  
  22. int *p2 = (int*)malloc(sizeof(int));
  23.  
  24. printf("子函数 局部变量 : \n");
  25. printf(" local_fni: %p \n", &local_fni);
  26. printf(" local_finz: %p \n", &local_finz);
  27. printf(" local_fiz: %p \n", &local_fiz);
  28.  
  29. printf("子函数 静态变量 : \n");
  30. printf(" static_fni: %p \n", &static_fni);
  31. printf(" static_finz: %p \n", &static_finz);
  32. printf(" static_fiz: %p \n", &static_fiz);
  33.  
  34. printf("子函数 指针变量 : \n");
  35. printf(" p2 : %p \n", p2);
  36.  
  37. printf("子函数地址 : \n");
  38. printf(" function : %p \n", function);
  39. }
  40.  
  41. int main(int argc, char **argv)
  42. {
  43. int local_mni;
  44. int local_minz = ;
  45. int local_miz = ;
  46.  
  47. static int static_mni;
  48. static int static_minz = ;
  49. static int static_miz = ;
  50.  
  51. int *p1 = (int*)malloc(sizeof(int));
  52. const int local_const0 = ;
  53. const int local_const1 = ;
  54. char* str_ptr = "char";
  55.  
  56. printf("主函数 局部变量 : \n");
  57. printf(" local_mni : %p \n", &local_mni);
  58. printf(" local_minz : %p \n", &local_minz);
  59. printf(" local_miz : %p \n", &local_miz);
  60.  
  61. printf("const 变量: \n");
  62. printf(" local_const0 : %p \n", &local_const0);
  63. printf(" local_const1 : %p \n", &local_const1);
  64. printf(" global_const0 : %p \n", &global_const0);
  65. printf(" global_const1 : %p \n", &global_const1);
  66.  
  67. printf("主函数 malloc指针变量 : \n");
  68. printf(" p1 : %p \n", p1);
  69.  
  70. printf("全局变量 : \n");
  71. printf(" global_ni : %p \n", &global_ni);
  72. printf(" global_inz : %p \n", &global_inz);
  73. printf(" global_iz : %p \n", &global_iz);
  74.  
  75. printf("主函数 静态变量 : \n");
  76. printf(" static_mni: %p \n", &static_mni);
  77. printf(" static_minz: %p \n", &static_minz);
  78. printf(" static_miz: %p \n", &static_miz);
  79.  
  80. printf("字符串常量 : \n");
  81. printf(" str_ptr : %p \n", str_ptr);
  82.  
  83. printf("主函数地址 : \n");
  84. printf(" main : %p \n", main);
  85.  
  86. printf("= = = = = = = = = = = = = = = \n");
  87.  
  88. function();
  89.  
  90. return ;
  91. }
  92.  
  93. /*
  94. = = = = = = = = = = = = = = =
  95. 测试:
  96. gcc -o test main.c
  97. objdump -Dhs test > test.dis
  98. ./test
  99.  
  100. 分析:
  101. Disassembly of section .text: 08048370
  102. {
  103. 子函数地址 :
  104. function : 0x8048424
  105. 主函数地址 :
  106. main : 0x804851d
  107.  
  108. }
  109.  
  110. Disassembly of section .rodata: 080487d8
  111. {
  112. const 变量: 全局
  113. global_const0 : 0x80487e0
  114. global_const1 : 0x80487e4
  115.  
  116. 字符串常量 :
  117. str_ptr : 0x80488d0
  118. }

  119. //.data中是初始化为非0的全局变量和静态变量
  120. Disassembly of section .data: 0804a014
  121. {
  122. 子函数 静态变量 :
  123. static_finz: 0x804a024
  124.  
  125. 全局变量 :
  126. global_inz : 0x804a01c
  127.  
  128. 主函数 静态变量 :
  129. static_minz: 0x804a020
  130. }
  131.  
  132. //.bss中是初始化为0以及没有初始化的全局变量和静态变量
  133. Disassembly of section .bss: 0804a028
  134. {
  135. 子函数 静态变量 :
  136. static_fni: 0x804a03c
  137. static_fiz: 0x804a040
  138.  
  139. 全局变量 :
  140. global_iz : 0x804a030
  141. global_ni : 0x804a044
  142.  
  143. 主函数 静态变量 :
  144. static_mni: 0x804a034
  145. static_miz: 0x804a038
  146. }
  147.  
  148. 堆空间: //动态的
  149. {
  150. 主函数 malloc指针变量 :
  151. p1 : 0x967c008
  152.  
  153. 子函数 malloc指针变量 :
  154. p2 : 0x967c018
  155. }
  156.  
  157. 栈空间: //动态的
  158. {
  159. 子函数 局部变量 :
  160. local_fiz : 0xbfb79924
  161. local_finz: 0xbfb79928
  162. local_fni : 0xbfb7992c
  163.  
  164. const 变量: 局部
  165. local_const1 : 0xbfe3cee8
  166. local_const0 : 0xbfe3ceec
  167.  
  168. 主函数 局部变量 :
  169. local_miz : 0xbfb79964
  170. local_minz: 0xbfb79968
  171. local_mni : 0xbfb7996c
  172. }
  173. */

附反汇编文件test.dis节选

  1. test: file format elf32-i386
  2.  
  3. Sections:
  4. Idx Name Size VMA LMA File off Algn
  5. .interp **
  6. CONTENTS, ALLOC, LOAD, READONLY, DATA
  7. .note.ABI-tag **
  8. CONTENTS, ALLOC, LOAD, READONLY, DATA
  9. .note.gnu.build-id **
  10. CONTENTS, ALLOC, LOAD, READONLY, DATA
  11. .gnu.hash 0804818c 0804818c 0000018c **
  12. CONTENTS, ALLOC, LOAD, READONLY, DATA
  13. .dynsym 080481ac 080481ac 000001ac **
  14. CONTENTS, ALLOC, LOAD, READONLY, DATA
  15. .dynstr 0804821c 0804821c 0000021c **
  16. CONTENTS, ALLOC, LOAD, READONLY, DATA
  17. .gnu.version 0000000e **
  18. CONTENTS, ALLOC, LOAD, READONLY, DATA
  19. .gnu.version_r **
  20. CONTENTS, ALLOC, LOAD, READONLY, DATA
  21. .rel.dyn 080482a4 080482a4 000002a4 **
  22. CONTENTS, ALLOC, LOAD, READONLY, DATA
  23. .rel.plt 080482ac 080482ac 000002ac **
  24. CONTENTS, ALLOC, LOAD, READONLY, DATA
  25. .init 080482d4 080482d4 000002d4 **
  26. CONTENTS, ALLOC, LOAD, READONLY, CODE
  27. .plt **
  28. CONTENTS, ALLOC, LOAD, READONLY, CODE
  29. .text 0000044c **
  30. CONTENTS, ALLOC, LOAD, READONLY, CODE
  31. .fini 0000001c 080487bc 080487bc 000007bc **
  32. CONTENTS, ALLOC, LOAD, READONLY, CODE
  33. .rodata 000002db 080487d8 080487d8 000007d8 **
  34. CONTENTS, ALLOC, LOAD, READONLY, DATA
  35. .eh_frame 08048ab4 08048ab4 00000ab4 **
  36. CONTENTS, ALLOC, LOAD, READONLY, DATA
  37. .ctors 08049f14 08049f14 00000f14 **
  38. CONTENTS, ALLOC, LOAD, DATA
  39. .dtors 08049f1c 08049f1c 00000f1c **
  40. CONTENTS, ALLOC, LOAD, DATA
  41. .jcr 08049f24 08049f24 00000f24 **
  42. CONTENTS, ALLOC, LOAD, DATA
  43. .dynamic 000000c8 08049f28 08049f28 00000f28 **
  44. CONTENTS, ALLOC, LOAD, DATA
  45. .got 08049ff0 08049ff0 00000ff0 **
  46. CONTENTS, ALLOC, LOAD, DATA
  47. .got.plt 08049ff4 08049ff4 00000ff4 **
  48. CONTENTS, ALLOC, LOAD, DATA
  49. .data 0804a014 0804a014 **
  50. CONTENTS, ALLOC, LOAD, DATA
  51. .bss 0804a028 0804a028 **
  52. ALLOC
  53. .comment 0000006c **
  54. CONTENTS, READONLY

gcc代码反汇编查看内存分布[1]: gcc的更多相关文章

  1. gcc代码反汇编查看内存分布[2]: arm-linux-gcc

    arm-none-linux-gnueabi-gcc -v gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) 重点: 代码中的内存分配, 地址从低到高: ...

  2. 在VisualStudio调试器中使用内存窗口和查看内存分布

    调试模式下内存窗口的使用 在调试期间,"内存"窗口显示应用使用的内存空间.调试器窗口(如"监视"."自动"."局部变量" ...

  3. 转载:C++类内存分布

    本文转自:http://www.cnblogs.com/jerry19880126/p/3616999.html,原文写的非常好,从中学到了虚继承的概念,也学会了用VS查看内存分布. 说下C++内存分 ...

  4. C语言内存分布

    C语言内存分布 典型的C语言程序内存表示分区共有5个部分: 正文段 Text segment 已初始化数据段(数据段)Initialized data segment 未初始化数据段(bss)Unin ...

  5. 1.预处理,生成预编译文件(.文件): Gcc –E hello.c –o hello.i 2.编译,生成汇编代码(.s文件): Gcc –S hello.i –o hello.s 3.汇编,生成目标文件(.o文件): Gcc –c hello.s –o hello.o 4.链接,生成可执行文件: linux笔记

    1 动态查看日志 tail -f filename tail -1000f filename 2 解压当前目录内容为xxx.zip  zip -r xxx.zip ./* 3 查看内存使用情况 fre ...

  6. C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)

      BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS段属于静态内存分配. 数据段 : ...

  7. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  8. 使用汇编分析c代码的内存分布

    arm平台下使用反汇编分析c内存分布: arm:使用arm-linux-objdump命令将编译完毕之后的elf文件,进行反汇编. 之后重定向到tmp.s文件里. 第一步变量例如以下c文件. vim ...

  9. 内存模型 Memory model 内存分布及程序运行中(BSS段、数据段、代码段、堆栈

    C语言中内存分布及程序运行中(BSS段.数据段.代码段.堆栈) - 秦宝艳的个人页面 - 开源中国 https://my.oschina.net/pollybl1255/blog/140323 Mem ...

随机推荐

  1. 树莓派高级GPIO库,wiringpi2 for python使用笔记(三)GPIO操作

    GPIO库的核心功能,当然就是操作GPIO了,GPIO就是"通用输入/输出"接口,比如点亮一个LED.继电器等,或者通过iic spi 1-wire等协议,读取.写入数据,这都是G ...

  2. composer api 参考

    composer note 简介 composer 是php的依赖管理工具.可以声明项目所依赖的库,composer会帮我们安装上 composer 默认基于项目来管理和安装库(包),将依赖的库安装到 ...

  3. Pro/E 5.0安装图解教程(也适用于Creo Elements/Pro 5.0)

    安装前必读:☆ 本教程适用于 32 位 proe 5.0 M010,M020,M030,M040,M050,M060 过程完全一样:☆ 本教程用于 64 位 proe 5.0 M010,M020,M0 ...

  4. 修改win7注册表发挥大容量内存优势

    现在请打开注册表编辑器,找到[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control \Session Manager\MomoryManagement ...

  5. HDU 5059 Help him

    题解:先判断第一个是否负号.如果是把第一个符号拿掉之后判断后面的长度是否<=12,并且是否数字,然后转化成数字看看是否在[a,b],注意-0这个数据. 如果不是判断长度是否<=12,并且是 ...

  6. 1分钟搞定超慢SQL

    前几天,一个用户的研发人员找到我了,说他们有个SQL语句非常慢,我说多慢?他们说:半个小时也没出结果.于是问他们要了SQL语句和执行计划,SQL语句就不能再这里贴出来了,下面是调整前的执行计划(略去某 ...

  7. CSS 布局总结——固定宽度布局

    固定宽度布局 单列布局 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2Fyd29sZjI0/font/5a6L5L2T/fontsize/400/fil ...

  8. Android 匿名共享内存C接口分析

    在Android 匿名共享内存驱动源码分析中详细分析了匿名共享内存在Linux内核空间的实现,虽然内核空间实现了匿名共享内存,但仍然需要在用户空间为用户使用匿名共享内存提供访问接口.Android系统 ...

  9. python闭包以及装饰器

    通俗的定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).它只不过是个“内层”的函数,由一个名字(变量)来指代,而这个名字(变 ...

  10. zoj 2110

    这道题困扰我的不是算法问题.而是细节问题.不优化一直搜到底 时间是690ms左右 没有优化的dfs #include<stdio.h> #include<string.h> # ...