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

发布者:未来画家最新更新时间:2023-09-01 来源: elecfans关键字:反汇编  内存分布  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

#include


int global_ni;        // .bss

int global_iz = 0 ; // .bss


int global_inz = 1; // .data


const 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-littlearm


Sections:

Idx Name          Size      VMA       LMA       File off  Algn

  0 .interp       00000013  00008134  00008134  00000134  2**0

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  1 .note.ABI-tag 00000020  00008148  00008148  00000148  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA, LINK_ONCE_SAME_CONTENTS

  2 .hash         0000003c  00008168  00008168  00000168  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  3 .dynsym       000000a0  000081a4  000081a4  000001a4  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  4 .dynstr       000000a7  00008244  00008244  00000244  2**0

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  5 .gnu.version  00000014  000082ec  000082ec  000002ec  2**1

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  6 .gnu.version_r 00000040  00008300  00008300  00000300  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  7 .rel.dyn      00000008  00008340  00008340  00000340  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  8 .rel.plt      00000030  00008348  00008348  00000348  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  9 .init         0000000c  00008378  00008378  00000378  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, CODE

 10 .plt          0000005c  00008384  00008384  00000384  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, CODE

 11 .text         000004d8  000083e0  000083e0  000003e0  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, CODE

 12 .fini         00000008  000088b8  000088b8  000008b8  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, CODE

 13 .rodata       00000314  000088c0  000088c0  000008c0  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

 14 .ARM.extab    00000024  00008bd4  00008bd4  00000bd4  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

 15 .ARM.exidx    00000040  00008bf8  00008bf8  00000bf8  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

 16 .init_array   00000004  00010c38  00010c38  00000c38  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 17 .fini_array   00000004  00010c3c  00010c3c  00000c3c  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 18 .jcr          00000004  00010c40  00010c40  00000c40  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 19 .dynamic      000000f0  00010c44  00010c44  00000c44  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 20 .got          00000028  00010d34  00010d34  00000d34  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 21 .data         00000014  00010d5c  00010d5c  00000d5c  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 22 .bss          0000001c  00010d70  00010d70  00000d70  2**2

                  ALLOC

 23 .ARM.attributes 0000002b  00000000  00000000  00000d70  2**0

                  CONTENTS, READONLY

 24 .comment      0000002b  00000000  00000000  00000d9b  2**0

[1] [2]
关键字:反汇编  内存分布  arm-linux-gcc 引用地址:gcc代码反汇编查看内存分布[2]: arm-linux-gcc

上一篇:ARM异常---一个Uart中断的触发处理过程
下一篇:gcc代码反汇编查看内存分布[1]: gcc

推荐阅读最新更新时间:2024-11-12 18:09

开发板学习Day8:第009课 gccarm-linux-gcc和Makefile
第001节_gcc编译器1_gcc常用选项__gcc编译过程详解 一,gcc简介 gcc : GNU Compiler Collection 特点:功能强大、功能灵活、多平台(X86、Arm);既支持宿主的开发,又支持交叉编译。 二,gcc编译程序过程(以test.c为例) 一个CC++程序至少需要预处理(preprocessing)、编译(compilation)、汇编(assembly)、链接(linking)这四步才能称为可执行文件。下面进行详细介绍: - 预处理(Pre-Processing) 此过程主要处理C源文件中的”#ifdef”、”#include”、”#define”等预处理命令,宏定义展开,并且将i
[单片机]
开发板学习Day8:第009课 <font color='red'>gcc</font>和<font color='red'>arm-linux-gcc</font>和Makefile
hex的反汇编文件译码及说明(获得函数地址)
avr单片机用C语言仿真软件编译之后生成hex文件,我们可以通过反汇编软件来还原汇编代码, hex反汇编软件 : 下载地址 (右键选择下载工具下载,比如迅雷下载) 以下是我做的一个实验,产生的《实验.hex》文件通过反汇编,之后得到的代码,其此函数的功能也就是获得每一个自定义的函数在flash里的地址,通过反汇编更能了解其数值返回过程,解读。 通过此上的反汇编实验,可以用来做 基于avr的多任务机制 点击衔接。 如下 ; reassembly of 实验.hex ; created by ReAVR V3.2.0 ; at 2010/01/31 - 19:38:25 ; for ICCAVR assembler ;-
[单片机]
arm-linux-gcc裸机程序开发(三)
一. 中断问题 中断对编写程序非常的重要,所以程序对中断处理的好坏将直接影响程序的优劣,对实时性要求较高的系统更是如此。对于ADS2.0,在编写中断处理程序的时候,只需要在程序前面加上 _irq 这个关键字,ADS就会自动为我们保存中断现场,等程序返回的时候自动恢复现场,细节无须我们关心。当然,也可以不加这个关键字,如果这样就得自己保存与恢复中断现场,考虑的问题就多了。arm-linux-gcc开发环境下,目前我还没有发现类似“_irq”这样的关键字可以通知编译器自动处理中断过程。因此,如果使用arm-linux-gcc编译带有中断的程序,就必须自己处理中断现场。除了保护中断现场外,程序还需要做的就是设置正确的中断向量表,
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved