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

重点:

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

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

#include<stdio.h>
#include<stdlib.h> int global_ni; // .bss
int global_iz = ; // .bss int global_inz = ; // .data const int global_const0 = ;
const int global_const1 = ; void function(void)
{
int local_fni;
int local_finz = ;
int local_fiz = ; static int static_fni;
static int static_finz = ;
static int static_fiz = ; int *p2 = (int*)malloc(sizeof(int)); printf("子函数 局部变量 : \n");
printf(" local_fni: %p \n", &local_fni);
printf(" local_finz: %p \n", &local_finz);
printf(" local_fiz: %p \n", &local_fiz); printf("子函数 静态变量 : \n");
printf(" static_fni: %p \n", &static_fni);
printf(" static_finz: %p \n", &static_finz);
printf(" static_fiz: %p \n", &static_fiz); printf("子函数 指针变量 : \n");
printf(" p2 : %p \n", p2); printf("子函数地址 : \n");
printf(" function : %p \n", function);
} int main(int argc, char **argv)
{
int local_mni;
int local_minz = ;
int local_miz = ; static int static_mni;
static int static_minz = ;
static int static_miz = ; int *p1 = (int*)malloc(sizeof(int));
const int local_const0 = ;
const int local_const1 = ;
char* str_ptr = "char"; printf("主函数 局部变量 : \n");
printf(" local_mni : %p \n", &local_mni);
printf(" local_minz : %p \n", &local_minz);
printf(" local_miz : %p \n", &local_miz); printf("const 变量: \n");
printf(" local_const0 : %p \n", &local_const0);
printf(" local_const1 : %p \n", &local_const1);
printf(" global_const0 : %p \n", &global_const0);
printf(" global_const1 : %p \n", &global_const1); printf("主函数 malloc指针变量 : \n");
printf(" p1 : %p \n", p1); printf("全局变量 : \n");
printf(" global_ni : %p \n", &global_ni);
printf(" global_inz : %p \n", &global_inz);
printf(" global_iz : %p \n", &global_iz); printf("主函数 静态变量 : \n");
printf(" static_mni: %p \n", &static_mni);
printf(" static_minz: %p \n", &static_minz);
printf(" static_miz: %p \n", &static_miz); printf("字符串常量 : \n");
printf(" str_ptr : %p \n", str_ptr); printf("主函数地址 : \n");
printf(" main : %p \n", main); printf("= = = = = = = = = = = = = = = \n"); function(); return ;
} /*
= = = = = = = = = = = = = = =
测试:
gcc -o test main.c
objdump -Dhs test > test.dis
./test 分析:
Disassembly of section .text: 08048370
{
子函数地址 :
function : 0x8048424
主函数地址 :
main : 0x804851d } Disassembly of section .rodata: 080487d8
{
const 变量: 全局
global_const0 : 0x80487e0
global_const1 : 0x80487e4 字符串常量 :
str_ptr : 0x80488d0
}

//.data中是初始化为非0的全局变量和静态变量
Disassembly of section .data: 0804a014
{
子函数 静态变量 :
static_finz: 0x804a024 全局变量 :
global_inz : 0x804a01c 主函数 静态变量 :
static_minz: 0x804a020
} //.bss中是初始化为0以及没有初始化的全局变量和静态变量
Disassembly of section .bss: 0804a028
{
子函数 静态变量 :
static_fni: 0x804a03c
static_fiz: 0x804a040 全局变量 :
global_iz : 0x804a030
global_ni : 0x804a044 主函数 静态变量 :
static_mni: 0x804a034
static_miz: 0x804a038
} 堆空间: //动态的
{
主函数 malloc指针变量 :
p1 : 0x967c008 子函数 malloc指针变量 :
p2 : 0x967c018
} 栈空间: //动态的
{
子函数 局部变量 :
local_fiz : 0xbfb79924
local_finz: 0xbfb79928
local_fni : 0xbfb7992c const 变量: 局部
local_const1 : 0xbfe3cee8
local_const0 : 0xbfe3ceec 主函数 局部变量 :
local_miz : 0xbfb79964
local_minz: 0xbfb79968
local_mni : 0xbfb7996c
}
*/

附反汇编文件test.dis节选

test:     file format elf32-i386

Sections:
Idx Name Size VMA LMA File off Algn
.interp **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.note.ABI-tag **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.note.gnu.build-id **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.gnu.hash 0804818c 0804818c 0000018c **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.dynsym 080481ac 080481ac 000001ac **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.dynstr 0804821c 0804821c 0000021c **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.gnu.version 0000000e **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.gnu.version_r **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.rel.dyn 080482a4 080482a4 000002a4 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.rel.plt 080482ac 080482ac 000002ac **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.init 080482d4 080482d4 000002d4 **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.plt **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.text 0000044c **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.fini 0000001c 080487bc 080487bc 000007bc **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.rodata 000002db 080487d8 080487d8 000007d8 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.eh_frame 08048ab4 08048ab4 00000ab4 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.ctors 08049f14 08049f14 00000f14 **
CONTENTS, ALLOC, LOAD, DATA
.dtors 08049f1c 08049f1c 00000f1c **
CONTENTS, ALLOC, LOAD, DATA
.jcr 08049f24 08049f24 00000f24 **
CONTENTS, ALLOC, LOAD, DATA
.dynamic 000000c8 08049f28 08049f28 00000f28 **
CONTENTS, ALLOC, LOAD, DATA
.got 08049ff0 08049ff0 00000ff0 **
CONTENTS, ALLOC, LOAD, DATA
.got.plt 08049ff4 08049ff4 00000ff4 **
CONTENTS, ALLOC, LOAD, DATA
.data 0804a014 0804a014 **
CONTENTS, ALLOC, LOAD, DATA
.bss 0804a028 0804a028 **
ALLOC
.comment 0000006c **
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. Cortex-M3动态加载三(模块调用系统函数)

    在我的arm动态加载实验中需要解决一个模块调用系统函数的问题,可以使用以下的一个方法.将系统函数固定在某一段地址空间,然后导出这一块的符号表到符号文件中,要记载的模块link的时候使用这个符号表文件, ...

  2. Qt监测光驱变化(使用WM_DEVICECHANGE)

    xxx.h protected: bool winEvent(MSG *msg,long * result); xxx.cpp bool CBlurayTranscoderDlg::winEvent( ...

  3. HDU 4417 Super Mario

    题解:函数式线段树求区间小于等于k的数有几个,离线做法,首先将所有询问和序列一起离散,然后用函数式线段树处理. #include <map> #include <cstdio> ...

  4. oralce dg conf

    http://wenku.baidu.com/view/ea9fa16cdd36a32d73758168.html http://ylw6006.blog.51cto.com/470441/84181 ...

  5. Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs)

    Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs) Cola:一个分布式爬虫框架 发布时间:2013-06-17 14:58:27, 关注:+2034, 赞美: ...

  6. 成都Uber优步司机快速注册攻略(外地车牌也可加入,不用现场培训)

    我加入Uber司机有一段时间了,有一些经验和感想分享给大家,让大家少走些弯路.目前加入优步不收取任何费用,不需要抢单,时间安排自由灵活,使用便捷,深受大众喜爱. 加入人民优步拼车条件:购买运行5年之内 ...

  7. Java图形化界面设计——布局管理器之GridLayout(网格布局)

    网格布局特点: l  使容器中的各组件呈M行×N列的网格状分布. l  网格每列宽度相同,等于容器的宽度除以网格的列数. l  网格每行高度相同,等于容器的高度除以网格的行数. l  各组件的排列方式 ...

  8. Linux操作系统定时任务系统Cron入门、PHP计划任务以及rpc示例

    一.简单介绍 1.cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动.关闭这个服务: servic ...

  9. javascript中对变量类型的推断

    本文正式地址:http://www.xiabingbao.com/javascript/2015/07/04/javascript-type 在JavaScript中,有5种基本数据类型和1种复杂数据 ...

  10. Javascript数组的声明

    var cars=new Array(); cars[0]="Audi"; cars[1]="BMW"; cars[2]="Volvo"; ...