linux 内存变量的分布

 

我们知道,linux通过虚拟内存管理进程的内存(进程的地址空间),而进程的地址空间分布如下 :

 

  从进程的空间中可以看出,内存中的变量有的来自可执行elf文件,在elf文件中已经分配好存储空间,有的是在可执行文件运行过程中分配存储空间

区域 描述 变量类型
.text 代码段 程序代码
.rodata 只读数据段 只读变量和字符串常量
.data、.bss 全局数据段

.data存放:已经初始化的全局变量和局部静态变量;

.bss存放:未经初始化的全局变量和局部静态变量;

stack 栈区 局部变量
heap 堆区 malloc空间分配的变量

 

测试代码

    

  1 #include <stdio.h>                                                                                                                       |" Press <F1>, ? for help
  2 #include <strings.h>                                                                                                                     |
  3 #include <stdlib.h>                                                                                                                      |▼ variables
  4                                                                                                                                          |    global_init_var
  5 int global_init_var = 0x84;                                                                                                              |    global_uninit_var
  6 int global_uninit_var;                                                                                                                   |    str                       
  7                                                                                                                                          |
  8 char str[] = "acdef";                                                                                                                    |▼ functions
  9 void func(int i)                                                                                                                         |    func(int i)
 10 {                                                                                                                                        |    main(void)
 11     printf("%d\n",i);                                                                                                                    |~                             
 12 }                                                                                                                                        |~                             
 13                                                                                                                                          |~                             
 14 int main(void)                                                                                                                           |~                             
 15 {                                                                                                                                        |~                             
 16     static int static_var = 0x85;                                                                                                        |~                             
 17     static int static_var2;                                                                                                              |~                             
 18     int a = 0x03;                                                                                                                        |~                             
 19     int b;                                                                                                                               |~                             
 20     func(static_var + static_var2 + a + b);                                                                                              |~                             
 21     return a;                                                                                                                            |~                             
 22 }  

     使用  gcc -c test.c (只编译不链接)

 

     使用 objdump  -h test.o   查看目标文件的结构和内容

 

 

     使用 objdump  -x -d -s test.o   查看目标文件中各个段和变量分布

   

 

posted @ 2021-01-23 12:58  老高和老李  阅读(146)  评论(0)    收藏  举报