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

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 = 0 ; // .bssint global_inz = 1; // .dataconst int global_const0 = 0;
const int global_const1 = 1;void function(void)
{int local_fni;int local_finz = 1;int local_fiz = 0 ;static int static_fni;static int static_finz = 1;static int static_fiz = 0 ;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 = 1;int local_miz = 0 ;static int static_mni;static int static_minz = 1;static int static_miz = 0 ;int *p1 = (int*)malloc(sizeof(int));const int local_const0 = 0;const int local_const1 = 1;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 0;
}/*
= = = = = = = = = = = = = = = 
测试: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-littlearmSections:
Idx Name          Size      VMA       LMA       File off  Algn0 .interp       00000013  00008134  00008134  00000134  2**0CONTENTS, ALLOC, LOAD, READONLY, DATA1 .note.ABI-tag 00000020  00008148  00008148  00000148  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA, LINK_ONCE_SAME_CONTENTS2 .hash         0000003c  00008168  00008168  00000168  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA3 .dynsym       000000a0  000081a4  000081a4  000001a4  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA4 .dynstr       000000a7  00008244  00008244  00000244  2**0CONTENTS, ALLOC, LOAD, READONLY, DATA5 .gnu.version  00000014  000082ec  000082ec  000002ec  2**1CONTENTS, ALLOC, LOAD, READONLY, DATA6 .gnu.version_r 00000040  00008300  00008300  00000300  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA7 .rel.dyn      00000008  00008340  00008340  00000340  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA8 .rel.plt      00000030  00008348  00008348  00000348  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA9 .init         0000000c  00008378  00008378  00000378  2**2CONTENTS, ALLOC, LOAD, READONLY, CODE10 .plt          0000005c  00008384  00008384  00000384  2**2CONTENTS, ALLOC, LOAD, READONLY, CODE11 .text         000004d8  000083e0  000083e0  000003e0  2**2CONTENTS, ALLOC, LOAD, READONLY, CODE12 .fini         00000008  000088b8  000088b8  000008b8  2**2CONTENTS, ALLOC, LOAD, READONLY, CODE13 .rodata       00000314  000088c0  000088c0  000008c0  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA14 .ARM.extab    00000024  00008bd4  00008bd4  00000bd4  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA15 .ARM.exidx    00000040  00008bf8  00008bf8  00000bf8  2**2CONTENTS, ALLOC, LOAD, READONLY, DATA16 .init_array   00000004  00010c38  00010c38  00000c38  2**2CONTENTS, ALLOC, LOAD, DATA17 .fini_array   00000004  00010c3c  00010c3c  00000c3c  2**2CONTENTS, ALLOC, LOAD, DATA18 .jcr          00000004  00010c40  00010c40  00000c40  2**2CONTENTS, ALLOC, LOAD, DATA19 .dynamic      000000f0  00010c44  00010c44  00000c44  2**2CONTENTS, ALLOC, LOAD, DATA20 .got          00000028  00010d34  00010d34  00000d34  2**2CONTENTS, ALLOC, LOAD, DATA21 .data         00000014  00010d5c  00010d5c  00000d5c  2**2CONTENTS, ALLOC, LOAD, DATA22 .bss          0000001c  00010d70  00010d70  00000d70  2**2ALLOC23 .ARM.attributes 0000002b  00000000  00000000  00000d70  2**0CONTENTS, READONLY24 .comment      0000002b  00000000  00000000  00000d9b  2**0CONTENTS, READONLY25 .debug_frame  00000044  00000000  00000000  00000dc8  2**2CONTENTS, READONLY, DEBUGGING

 

转载于:https://www.cnblogs.com/mylinux/p/5611287.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于SP一些响应码的API返回码及解析集合

在一些金融的行业&#xff08;银行、证券、保险等&#xff09;&#xff0c;如果接触了一些中间件&#xff0c;比如长城、恒银、广电等一些厂商的设备&#xff0c;不同的厂商有不同的一些规范&#xff0c;在应用开发的过程中难免会和中间件的错误码打交道&#xff0c;这里总结一…

eclipselink_Java EE 7的高峰– EclipseLink的多租户示例

eclipselink水族馆是有关所有相关规范和参考实现中有关Java EE进度的灵感和最新信息的重要来源。 他们从Oracle的Shaun Smith&#xff08; 博客 / 推特 &#xff09;获取了有关EclipseLink作为开源项目的地位和未来的演讲。 他介绍了将在EclipseLink 2.4中提供的所有新功能&…

我们的团队目标

我们的团队目标(WBS)&#xff1a; 完成一个规范的电脑应用程序&#xff0c;实现各个模块功能&#xff0c;让用户能够随时的存放自己的代码并且方便的提取到自己想要的代码进行查阅和修改。 团队项目的主要工作项目&#xff1a; 利用sql数据库和eclipse实现文件的存取查询。 个人…

关于一些常见智柜问题的分析及解决办法

竟然还有小伙伴感觉自研项目不好的小伙伴&#xff1f;渐渐感觉不管是在小公司或者在大公司&#xff0c;能有一个值得奋斗的远方就可以了&#xff0c;比如薪资高&#xff0c;钱多事少离家近&#xff0c;自己真的对自己目前做的事情感兴趣&#xff0c;否则干啥都感觉没劲&#xf…

流绩效–您的想法

上周&#xff0c;我介绍了一些有关Java 8流性能的基准测试结果。 你们和gal足够感兴趣&#xff0c;可以留下一些想法&#xff0c;还有哪些可以介绍。 这就是我所做的&#xff0c;这是结果。 总览 最后一篇文章的序言也适用于此。 阅读它&#xff0c;以找出所有数字为何撒谎&a…

java中JVM的原理

一、java虚拟机的生命周期&#xff1a; Java虚拟机的生命周期 一个运行中的Java虚拟机有着一个清晰的任务&#xff1a;执行Java程序。程序开始执行时他才运行&#xff0c;程序结束时他就停止。你在同一台机器上运行三个程序&#xff0c;就会有 三个运行中的Java虚拟机。 Java虚…

2022将至,前端程序员们应该一起放个烟花庆祝一下,走起

前言&#xff1a;小时候&#xff0c;在我印象中&#xff0c;每到快过年的时候就有很多卖炮仗的&#xff0c;一般也就是阳历的12月份到明年的正月15号卖炮仗的商家比较多&#xff0c;省下买辣条的钱去买炮仗&#xff0c;在老家也就过年和除夕两天及正月15日这几天放烟花和炮仗比…

微信红包封面开放平台序列号

微信红包封面开放平台是一款可以领取微信红包封面的平台&#xff0c;最近网上非常流行好玩的微信红包封面&#xff0c;每一种封面都极具特色&#xff0c;让你的微信红包与众不同&#xff0c;还可以定制专属的微信红包封面&#xff0c;不过名额有限&#xff0c;这边为大家带来这…

ios多线程 -- NSOperation 简介

NSOperation的作⽤&#xff1a;配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤&#xff1a; 1&#xff09;先将需要执行的操作封装到一个NSOperation对象中 2&#xff09;然后将NSOperation对象添加到NSOpera…

在没有复杂插件的情况下从Eclipse启动和调试Tomcat

像Eclipse这样的现代IDE提供了各种插件来简化Web开发。 但是&#xff0c;我相信将Tomcat作为“常规” Java应用程序启动仍然可以提供最佳的调试体验。 大多数时候&#xff0c;这是因为这些工具将Tomcat或任何其他servlet容器作为外部进程启动&#xff0c;然后在其上附加一个远程…

【javascript高级教程】JavaScript 对象

JavaScript 中的所有事物都是对象&#xff1a;字符串、数值、数组、函数...及自定义对象 JavaScript 提供多个内建对象&#xff0c;比如 String、Date、Array 等等。 对象只是带有属性和方法的特殊数据类型。 布尔型可以是一个对象。数字型可以是一个对象。字符串也可以是一个…

php 字符串函数

函数名描述实例输入输出trim()删除字符串两端的空格和其他预定义字符 $str"\r\nHello\r\n"; echo trim($str) 目标字符串 清除后的字符串 rtrim()/chop() 删除字符串右边的空格或其他预定义字符 ltrim() 删除字符串左边的空格或其他预定义字符 …

Lucene分析过程指南

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中&#xff0c;您将了解Lucene。 您将了解为什么这样的库很重要&#xff0c;然后了解Lucene中搜索的工作方式。 此外&#xff0c;您将学习如何将Lucene Search集成到您自己的应用程序中&#xff0c;以…

【JavaScript高级教程】JavaScript prototype(原型对象)

所有的 JavaScript 对象都会从一个 prototype&#xff08;原型对象&#xff09;中继承属性和方法。 function Person(first, last, age, eyecolor) {this.firstName first;this.lastName last;this.age age;this.eyeColor eyecolor; }var myFather new Person("John…

【javascript高级教程】JavaScript Number 对象

JavaScript 只有一种数字类型。可以使用也可以不使用小数点来书写数字。 var pi3.14; // 使用小数点 var x34; // 不使用小数点 极大或极小的数字可通过科学&#xff08;指数&#xff09;计数法来写&#xff1a; var y123e5; // 12300000 var z123e-5; // 0.0…

【leetcode】clone-graph

写在前面的话&#xff1a; 看了看自己的博客&#xff0c;从一月底开始就没怎么更新过&#xff0c;我也确实将近5个月没怎么写代码了。今天突然觉得有些心慌&#xff0c;感觉手都已经生疏了。果然&#xff0c;随便找了道题就卡住了。隐约感觉要用map但又不太记得用法了&#xff…

【javascript高级教程】JavaScript 字符串(String) 对象

String 对象用于处理已有的字符块。 JavaScript 字符串 一个字符串用于存储一系列字符就像 "John Doe". 一个字符串可以使用单引号或双引号&#xff1a; var carname"Volvo XC60"; var carnameVolvo XC60; 你使用位置&#xff08;索引&#xff09;可以…

Redis教程:NoSQL键值存储

课程大纲 Redis是使用ANSI C编写的具有可选持久性的开源&#xff0c;网络化&#xff0c;内存中键值数据存储。根据DB-Engines.com的月度排名&#xff0c;Redis是最受欢迎的键值存储。 它的名字意思是远程字典服务器。 Redis已获得BSD许可&#xff0c;并且通常被称为数据结构服…

java 里面eaquls和==区别

java中的数据类型&#xff0c;可分为两类&#xff1a; 1.基本数据类型&#xff0c;也称原始数据类型。byte,short,char,int,long,float,double,boolean 他们之间的比较&#xff0c;应用双等号&#xff08;&#xff09;,比较的是他们的值。 2.复合数据类型(类) 当他们用…

【javascript高级教程】JavaScript Array(数组) 对象

数组对象的作用是&#xff1a;使用单独的变量名来存储一系列的值。 创建数组, 为其赋值&#xff1a; var mycars new Array(); mycars[0] "Saab"; mycars[1] "Volvo"; mycars[2] "BMW"; 什么是数组? 数组对象是使用单独的变量名来存储一…