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

发布时间:2023-09-01  

# gcc -v

gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)


重点:


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


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


#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;

}


/*

= = = = = = = = = = = = = = = 

测试:

 gcc -o test main.c 

 objdump -Dhs test > test.dis 

 ./test 

 

分析:


Disassembly of section .text: 08048370

{

子函数地址 : 

 function : 0x8048424

主函数地址 : 

 main : 0x804851d 


}


Disassembly of section .rodata: 080487d8

{

const 变量: 全局

 global_const0 : 0x80487e0 

 global_const1 : 0x80487e4 

    

字符串常量 : 

 str_ptr : 0x80488d0 

}


//.data中是初始化为非0的全局变量和静态变量

Disassembly of section .data: 0804a014

{

子函数 静态变量 : 

 static_finz: 0x804a024 

 

全局变量 : 

 global_inz : 0x804a01c 

 

主函数 静态变量 : 

 static_minz: 0x804a020 

}    


//.bss中是初始化为0以及没有初始化的全局变量和静态变量

Disassembly of section .bss: 0804a028

{

子函数 静态变量 : 

 static_fni: 0x804a03c 

 static_fiz: 0x804a040 

 

全局变量 : 

 global_iz : 0x804a030 

 global_ni : 0x804a044 

 

主函数 静态变量 : 

 static_mni: 0x804a034 

 static_miz: 0x804a038 

}

 

堆空间: //动态的

{

主函数 malloc指针变量 : 

 p1 : 0x967c008 

 

子函数 malloc指针变量 : 

 p2 : 0x967c018 

}


栈空间:    //动态的

{

子函数 局部变量 : 

 local_fiz : 0xbfb79924 

 local_finz: 0xbfb79928 

 local_fni : 0xbfb7992c 

 

const 变量: 局部

 local_const1 : 0xbfe3cee8 

 local_const0 : 0xbfe3ceec 

 

主函数 局部变量 : 

 local_miz : 0xbfb79964 

 local_minz: 0xbfb79968 

 local_mni : 0xbfb7996c

}

*/


附反汇编文件test.dis节选


test:     file format elf32-i386


Sections:

Idx Name          Size      VMA       LMA       File off  Algn

  0 .interp       00000013  08048134  08048134  00000134  2**0

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

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

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  2 .note.gnu.build-id 00000024  08048168  08048168  00000168  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  3 .gnu.hash     00000020  0804818c  0804818c  0000018c  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  4 .dynsym       00000070  080481ac  080481ac  000001ac  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  5 .dynstr       00000058  0804821c  0804821c  0000021c  2**0

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  6 .gnu.version  0000000e  08048274  08048274  00000274  2**1

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  7 .gnu.version_r 00000020  08048284  08048284  00000284  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  8 .rel.dyn      00000008  080482a4  080482a4  000002a4  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

  9 .rel.plt      00000028  080482ac  080482ac  000002ac  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

 10 .init         00000030  080482d4  080482d4  000002d4  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, CODE

 11 .plt          00000060  08048304  08048304  00000304  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, CODE

 12 .text         0000044c  08048370  08048370  00000370  2**4

                  CONTENTS, ALLOC, LOAD, READONLY, CODE

 13 .fini         0000001c  080487bc  080487bc  000007bc  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, CODE

 14 .rodata       000002db  080487d8  080487d8  000007d8  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

 15 .eh_frame     00000004  08048ab4  08048ab4  00000ab4  2**2

                  CONTENTS, ALLOC, LOAD, READONLY, DATA

 16 .ctors        00000008  08049f14  08049f14  00000f14  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 17 .dtors        00000008  08049f1c  08049f1c  00000f1c  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 18 .jcr          00000004  08049f24  08049f24  00000f24  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 19 .dynamic      000000c8  08049f28  08049f28  00000f28  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 20 .got          00000004  08049ff0  08049ff0  00000ff0  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 21 .got.plt      00000020  08049ff4  08049ff4  00000ff4  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 22 .data         00000014  0804a014  0804a014  00001014  2**2

                  CONTENTS, ALLOC, LOAD, DATA

 23 .bss          00000020  0804a028  0804a028  00001028  2**2

                  ALLOC

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    /opt/SQLite3/include -L /opt/SQLite3/lib -l sqite3”进行交叉编译,其中的库文件和头文件路径为前面编译安装SQLite3时的路径。完成后会生成可执行文件......
    应用程序二进制接口 ( Application Binary Interface, ABI)的一部分。 不管何种可执行文件格式,一些基本的要素是必须的,显而易见的,文件中应包含代码和数据。因为文件可能引用外部文件......
    格式——它包括可执行的目标代码,但并不是最终运行的形式。另外,它更可能包括未解析的到其他模块例程和数据的引用。 连接程序将来自汇编器的目标文件(其中有些可能保存在包含目标文件的库中)组合成可执行程序。 前端读出程序的源代码......
    ,LED0灭,持续切换。 2. 配置下载选项 说明一下,这里编译用的配置是Debug,而不是Release,Run配置时用的是Debug生成的可执行文件,在我们的实例工程中并没有什么不同,不涉......
    文件 创建 build 文件夹并切换 使用 cmake 命令生成构建系统 使用 make 命令构建系统,生成可执行文件 运行可执行文件执行......
    它用作连接编辑器(即连接器)的输入,而连接编辑器最终完成整个任务并生成可执行的程序作为输出。 从代码到可执行代码的转换过程经过了良好的定义并实现了自动化,而目标文件是这个链中有机的连接性环节。在这个转换过程中,目标文件......
    编译,但其功能不同: 第一个:它是编译当前界面所在的一个C 文件。 第二个:联合编译整个工程,发生修改的文件重新编译,并生成可执行文件。 第三个:联合编译整个工程,所有文件都重新编译,并生成可执行文件......
    进行预编译 即只是把预编译部分替换到程序里面 -o filename :对编译好的.o文件进行链接 生成可编译的执行文件 使用案例: 1. gcc -c one.c  这个命令是把one.c 编译且生成one.o......
    语言或其他编程语言编写STM32单片机的应用程序,根据具体需求调用各种外设库函数,控制外设的操作和数据传输,实现特定的功能。 编译和链接:使用编译器将源代码编译为机器代码,并将不同的源文件链接成一个可执行文件......
    在电脑上编写的程序最终是要烧写到芯片内部的 FLASH中(此处特指STM32)。 问题2:如何将可执行文件烧写至 FLASH 上 STM32 的启动方式有很多种,从主存 FLASH 启动,从 system memory......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>