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

#include

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代码反汇编查看内存分布[1]: gcc

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

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 ...

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

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

转载:C++类内存分布

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

C语言内存分布

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

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

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

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

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

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

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

[GeekBand] C++继承关系下虚函数内存分布

本文参考文献:GeekBand课堂内容,授课老师:侯捷 :深度探索C++对象模型(侯捷译) :网络资料,如:http://blog.csdn.net/sanfengshou/article/detai ...

随机推荐

Remove WebCakeDesktop

WebCakeDesktop.Updater.exe 是广告程序,卸载步骤参考 http://malwaretips.com/blogs/webcake-desktop-updater-exe-rem ...

javascript 通过IE ActiveX 获得本机内网ip

WMI Scripting HTML

数据库数据用Excel导出的3种方法

将数据库数据用Excel导出主要有3种方法:用Excel.Application接口.用OleDB.用HTML的Tabel标签 方法1——Excel.Application接口: 首先,需要要Exce ...

图片与字符串(base64编码)的转化

package com.demo; import java.util.*; import java.io.*; import sun.misc.BASE64Decoder; import sun.mi ...

thinkphp3.2.3的使用心得(零)

从模板传参到控制器 模板中代码:

Chained Exceptions in Java

1. Overview In this article, we’ll have a very brief look at what Exception is and go in depth about ...

git 创建SSH key

可以自己搭建一台运行Git的服务器,不过现阶段,为了学Git先搭个服务器绝对是小题大作.好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要 ...

arm32 linux 内存分布,gcc代码反汇编查看内存分布[2]: arm-linux-gcc相关推荐

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

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

  2. Linux运维:CentOS7下查看内存占用

    文章目录 查看主机信息 查看操作系统信息 查看Linux系统版本 查看物理CPU个数和型号 查看单个物理CPU核心数 查看逻辑CPU个数 查看内存信息 查看内存情况 查看内存剩余情况 内存使用排序取前 ...

  3. Linux内存管理内存映射以及通过反汇编定位内存错误问题

    提到C语言,我们知道C语言和其他高级语言的最大的区别就是C语言是要操作内存的! 我们需要知道--变量,其实是内存地址的一个抽像名字罢了.在静态编译的程序中,所有的变量名都会在编译时被转成内存地址.机器 ...

  4. 服务器显示内存错误怎么办,服务器怎么查看内存故障

    服务器怎么查看内存故障 内容精选 换一换 一次完整的HTTP请求包括域名解析.建立TCP连接.发起请求.服务器接收到请求进行处理并返回处理结果.浏览器对HTML代码进行解析并请求其他资源,以及对页面进 ...

  5. 查看windows服务器内存详细信息,Windows服务器查看内存型号

    Windows服务器查看内存型号 内容精选 换一换 以Windows 2008 R2 64bit为例,介绍查询Windows弹性云服务器磁盘分区与磁盘设备对应关系的方法.登录Windows弹性云服务器 ...

  6. linux c++ toolchain 配置文件,一步一步建立基于ARM+Linux的cross toolchain

    声明:本文在参考网上资料的基础上,以梁元恩的<如何为嵌入式开发建立交叉编译环境>为蓝本修改而成.对于自己在建立过程中遇到的问题进行了详细的说明,本文随自己学习的深入会进行相应的更新. 1引 ...

  7. linux查看目录文件系统,ubuntu linux 文件系统目录结构-Windows下查看电脑信息的命令-linux菜鸟也必须知道的几个ubuntu最基础命令_169IT.COM...

    1:sudo   应该是linux中最常用的命令之一了,因为你即便不是root用户,也能暂时的部分的获得root权限,例如安装卸载,更改各种服务的配置,等等,所以记住这个 2:apt-get : ap ...

  8. Linux工作笔记036---Centos下查看cpu、磁盘、内存使用情况以及如何清理内存

    JAVA技术交流QQ群:170933152 Centos下查看cpu.磁盘.内存使用情况以及如何清理内存 核查服务器基本情况 查看内存使用情况 free -m 查看cpu使用情况 top #查看进程运 ...

  9. Android 查看内存命令总结

    文章目录 内存相关概念解析 dumpsys meminfo procrank cat /proc/meminfo free vmstat 内存相关概念解析 一个进程占用了多少内存,主要有下述四种说法: ...

最新文章

  1. thinphp 整合ueditor
  2. 转: 浅析Fusion-IO和Intel SSD
  3. Know about RDBMS market share
  4. call_user_func() expects parameter 1 to be a valid callback, cannot access private method
  5. Redis面试题详解
  6. Sysbench 1.0.15安装及使用
  7. aop实现原理_Java:由浅入深揭开 AOP 实现原理
  8. RSA不下载批次的问题
  9. 统一代码格式 in UltraEdit
  10. WPF 面试题及答案(三)
  11. Postgres数据库报错:FATAL: Peer authentication failed for user “zabbix“ Previous connection kept
  12. redis集群环境搭建入门
  13. mysql安装包配置方式_mysql安装包方式安装及配置(Windows)
  14. [转载]只有那句不能唱——听《想把我唱给你听》
  15. 树莓派安装opencv3.4.3时缺少boostdesc等文件及一些常见的报错
  16. 曾抵押房子炒币、与老婆差点离婚! 如今这位80后中科院博士竟...
  17. C# signtool error:no certificates were found that met all the given criteria 错误解决方案
  18. Graph Representation Learning via Graphical Mutual Information Maximization
  19. 腾讯云CPU处理器Intel Ice Lake主频2.7GHz睿频3.3GHz)
  20. krait和kryo_各种Java序列化性能比较

热门文章

  1. ubuntu搭建nginx环境
  2. Pytorch Bi-LSTM + CRF 代码详解
  3. LeetCode中等题之煎饼排序
  4. LLVM与Clang编译图例
  5. AlexeyAB DarkNet YOLOv3框架解析与应用实践(二)
  6. php7安装redis6扩展
  7. DCN-s4600 跨vlan访问
  8. [JS] [C] [编程题] 用户喜好
  9. python 判断字符串是否为空,字典是否为空,列表是否为空,元组是否为空的方法
  10. jenkins+ant+jmeter接口测试