arm-none-linux-gnueabi-gcc -v

  gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202)

重点:

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

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

可以看出arm-none-linux-gnueabi-gcc编译和gcc编译结果是类似的.

#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 ;
} /*
= = = = = = = = = = = = = = =
测试:
arm-none-linux-gnueabi-gcc -o test main.c
arm-none-linux-gnueabi-objdump -Dhs test > test.dis 分析:
Disassembly of section .text: 000083e0
{
子函数地址 :
function :
主函数地址 :
main : } Disassembly of section .rodata: 000088c0
{
const 变量: 全局
global_const0
global_const1
字符串常量 : str_ptr
}
//.data中是初始化为非0的全局变量和静态变量
Disassembly of section .data: 00010d5c
{
global_inz
static_minz
static_finz
} //.bss中是初始化为0以及没有初始化的全局变量和静态变量
Disassembly of section .bss: 00010d70
{
global_iz
static_mni
static_miz
static_fni
static_fiz
global_ni } 堆空间: //动态的
{
主函数 malloc指针变量 :
p1 : 子函数 malloc指针变量 :
p2 :
} 栈空间: //动态的
{
子函数 局部变量 :
local_fiz :
local_finz:
local_fni : const 变量: 局部
local_const1 :
local_const0 : 主函数 局部变量 :
local_miz :
local_minz:
local_mni :
}
*/

反汇编文件test.dis节选

test:     file format elf32-littlearm

Sections:
Idx Name Size VMA LMA File off Algn
.interp **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.note.ABI-tag **
CONTENTS, ALLOC, LOAD, READONLY, DATA, LINK_ONCE_SAME_CONTENTS
.hash 0000003c **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.dynsym 000000a0 000081a4 000081a4 000001a4 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.dynstr 000000a7 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.gnu.version 000082ec 000082ec 000002ec **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.gnu.version_r **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.rel.dyn **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.rel.plt **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.init 0000000c **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.plt 0000005c **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.text 000004d8 000083e0 000083e0 000003e0 **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.fini 000088b8 000088b8 000008b8 **
CONTENTS, ALLOC, LOAD, READONLY, CODE
.rodata 000088c0 000088c0 000008c0 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.ARM.extab 00008bd4 00008bd4 00000bd4 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.ARM.exidx 00008bf8 00008bf8 00000bf8 **
CONTENTS, ALLOC, LOAD, READONLY, DATA
.init_array 00010c38 00010c38 00000c38 **
CONTENTS, ALLOC, LOAD, DATA
.fini_array 00010c3c 00010c3c 00000c3c **
CONTENTS, ALLOC, LOAD, DATA
.jcr 00010c40 00010c40 00000c40 **
CONTENTS, ALLOC, LOAD, DATA
.dynamic 000000f0 00010c44 00010c44 00000c44 **
CONTENTS, ALLOC, LOAD, DATA
.got 00010d34 00010d34 00000d34 **
CONTENTS, ALLOC, LOAD, DATA
.data 00010d5c 00010d5c 00000d5c **
CONTENTS, ALLOC, LOAD, DATA
.bss 0000001c 00010d70 00010d70 00000d70 **
ALLOC
.ARM.attributes 0000002b 00000d70 **
CONTENTS, READONLY
.comment 0000002b 00000d9b **
CONTENTS, READONLY
.debug_frame 00000dc8 **
CONTENTS, READONLY, DEBUGGING

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

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

    # gcc -vgcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 重点: 代码中的内存分配, 地址从低到高: 代码段(RO, 保存函数代码) --&g ...

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

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

  3. Ubuntu12.4 64位 安装 arm linux gcc 4.3.2

    一.下载arm linux gcc 4.3.2 http://pan.baidu.com/share/link?shareid=1575352696&uk=2754759285&fid ...

  4. 代码内存泄露检测工具(linux gcc + valrind)

    参考博客: https://www.cnblogs.com/wangkangluo1/archive/2011/07/20/2111248.html linux命令如下:valgrind --tool ...

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

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

  6. C语言内存分布

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

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

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

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

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

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

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

随机推荐

  1. 解决:sudo: parse error in /etc/sudoers near line 24 ...报错

    ubuntu系统下由于添加用户权限的时候直接用的vim对 /etc/sudoers 文件编辑,保存退出的时候,再使用sudo su 等等命令一直报错如下: sudo: parse error in / ...

  2. 开源项目之Android Afinal框架

    项目如图: 本文参考网络! Afinal是一个开源的android的orm和ioc应用开发框架,其特点是小巧灵活,代码入侵量少.在android应用开发中,通过Afinal的ioc框架,诸如ui绑定, ...

  3. Android面试笔试集锦

    前19题为常考题目 1. Android的四大组件是哪些,它们的作用? 答:Activity:Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各 ...

  4. Advanced Customization of the jQuery Mobile Buttons | Appcropolis

    Advanced Customization of the jQuery Mobile Buttons | Appcropolis Advanced Customization of the jQue ...

  5. c++11新特性(4) lambda捕捉块

    lambda表达式中的方括号成为捕捉块,能够在这里指定怎样从所在的作用域中捕捉变量. 捕捉的意思是指能够在该lambda中使用该变量.即能够捕获外部变量在lambda表达式内使用. 能够使用两种方式来 ...

  6. KeCode对照表(键盘按键的获取)

    KeyCode键盘对照表: http://www.cnblogs.com/furenjian/articles/2957770.html

  7. CSS 文章段落样式

    #adiv p { text-align: left; text-indent: 2em; line-height:25px; font-family:微软雅黑; font-size:medium; ...

  8. Dokcer 组成原理简介

    首先来张图了解Docker的组成 重要 Docker在启动容器的时候,需要创建文件系统,为rootfs提供挂载点.最初Docker仅能在支持Aufs文件系统的Linux发行版上运行,但是由于Aufs未 ...

  9. setCentralWidget就可以把Qwidget设置为QMainWindow的主窗口

    前面说的return app.exec() 这句话是用来使程序进入事件循环,除了直接递交的事件外,所有的事件都要在这个循环中被一层一层的分发,最后找到相应的处理函数来处理事件. 顶级窗口和顶级窗口是存 ...

  10. MVC模式已死

    MVC模式:Model模型 View试图 Control控制器,是目前主流模式,被当作服务器软件入门基本模式学习和掌握,主流框架Struts 1/2 JSF Wicket基本都顺理成章支持MVC模式. ...