zoukankan      html  css  js  c++  java
  • 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 ; // .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("子函数 局部变量 : 
    ");
        printf(" local_fni: %p 
    ", &local_fni);
        printf(" local_finz: %p 
    ", &local_finz);
        printf(" local_fiz: %p 
    ", &local_fiz);
    
        printf("子函数 静态变量 : 
    ");
        printf(" static_fni: %p 
    ", &static_fni);
        printf(" static_finz: %p 
    ", &static_finz);
        printf(" static_fiz: %p 
    ", &static_fiz);
        
        printf("子函数 指针变量 : 
    ");
        printf(" p2 : %p 
    ", p2);
        
        printf("子函数地址 : 
    ");
        printf(" function : %p 
    ", 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("主函数 局部变量 : 
    ");
        printf(" local_mni : %p 
    ", &local_mni);
        printf(" local_minz : %p 
    ", &local_minz);
        printf(" local_miz : %p 
    ", &local_miz);
        
        printf("const 变量: 
    ");
        printf(" local_const0 : %p 
    ", &local_const0);
        printf(" local_const1 : %p 
    ", &local_const1);
        printf(" global_const0 : %p 
    ", &global_const0);
        printf(" global_const1 : %p 
    ", &global_const1);
        
        printf("主函数 malloc指针变量 : 
    ");
        printf(" p1 : %p 
    ", p1);
    
        printf("全局变量 : 
    ");
        printf(" global_ni : %p 
    ", &global_ni);
        printf(" global_inz : %p 
    ", &global_inz);
        printf(" global_iz : %p 
    ", &global_iz);
    
        printf("主函数 静态变量 : 
    ");
        printf(" static_mni: %p 
    ", &static_mni);
        printf(" static_minz: %p 
    ", &static_minz);
        printf(" static_miz: %p 
    ", &static_miz);
    
        printf("字符串常量 : 
    ");
        printf(" str_ptr : %p 
    ", str_ptr);
    
        printf("主函数地址 : 
    ");
        printf(" main : %p 
    ", main);
    
        printf("= = = = = = = = = = = = = = = 
    ");
    
        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
                      CONTENTS, READONLY
     25 .debug_frame  00000044  00000000  00000000  00000dc8  2**2
                      CONTENTS, READONLY, DEBUGGING
  • 相关阅读:
    计算机算法设计与分析之棋盘覆盖问题
    在uboot里面加入环境变量使用run来运行
    软件project师的属性与发展
    Oracle 表三种连接方式(sql优化)
    POJ 1700 cross river (数学模拟)
    八:Java之I/O
    为 Python Server Pages 和 Oracle 构建快速 Web 开发环境。
    WebBot
    WebBrowserProgramming
    Skulpt
  • 原文地址:https://www.cnblogs.com/mylinux/p/5611287.html
Copyright © 2011-2022 走看看