(本节笔记的实验代码在这里)
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段中