2-4 Linux应用程序地址分析

来源:互联网 发布:红字知乎 编辑:程序博客网 时间:2024/06/08 06:37

(本节笔记的实验代码在这里)

Linux应用程序在内存中包括几个段,分别是:代码段、数据段、bss断、堆(heap)和栈(stack)

(涉及到链接器脚本,参考 1-1-4 链接器脚本)

(一下的地址布局分析是针对32bit系统)

1.  地址布局

    1.1  从低地址到高地址,分别是:代码段、数据段、bss段和堆栈

    1.2  堆向内存高地址生长,栈向内存低地址生长

2.  查看范例程序地址分布的办法:

    运行程序后,在另一个终端ps aux,可查看程序的进程号,再用cat根据程序进程号,打开程序系统地址布局列表,如:

cat /proc/6436/maps

代码段为只读可执行(r_x),起始地址未0x0804 8000,到0x0804 9000

数据段为:    0x0804 9000——0x0804 a000

        堆为:    0x093a 0000——0x093c 1000

        栈为:    0xbfe5 8000——0xbfeb d000

3.  一下是一段main.c的代码,具体说明了各语句和变量包含在程序块中所处的各位置:

int g_init_a = 1;                //全局,初始化的:data段

int g_uinit;                         //全局,未初始化:data段

static int s_g_init = 1;     //静态,全局,初始化:data段

static int s_g_uninit;       //静态,全局,未初始化:data段

const int const_a = 1;     //全局,静态:text段

int main(int argc, char ** argv)

{

    int g_init_a = 1;                        //局部,初始化:stack

    int g_uninit;                              //局部,未初始化:stack

    static int s_g_init_a = 1;        //静态,局部,初始化:data

    static int s_g_uninit;               //静态,局部,未初始化:data

    const int const_a =1;             //局部,初始化,常量:stack

    int *malloc_p_a;                     //局部,未初始化:stack

    malloc_p_a = malloc(sizeof(int));   //malloc分配的:heap

    return 0;

}


4.  数据存放总结:

    4.1  代码段(.text):代码,全局变量(const)、字符串常量

    4.2  数据段(.data):全局初始化和未初始化的常量,以及静态的全局和局部的初始化未初始化的变量

    4.3  堆(heap):动态分配的空间

    4.4  栈(stack):局部的初始化未初始化的,但不包含静态的变量


5.  利用readelf-s分析BSS段,用file查看文件属性,.bss段其实是.data段的一个字段,未初始化的变量都被丢到.bss段中



0 0
原创粉丝点击