一个典型的Linux C程序内存空间由如下几部分组成:
代码段(.text):这里存放代码、全局常量(const)、字符串常量。代码段是可共享的,相同的代码在内存中只会有一个拷贝,同时这个段是只读可执行的,防止程序由于错误而修改自身的指令。
初始化数据段(.data):这里存放的是程序中已初始化的全局变量和初始化的静态变量(全局以及局部的)。
未初始化数据段(.bss):存放的是未初始化的全局变量和未初始化的静态变量。位于这一段中的数据,内核在执行该程序前,将其初始化为0或者null。
堆(Heap):这个段用于在程序中进行动态内存申请,例如经常用到的malloc,new系列函数就是从这个段中申请内存。
栈(Stack):函数中的局部变量(不包括静态变量)以及局部只读变量(const)保存在此段中。
当一个Linux应用程序在内存中运行时,以上几部分在内存中的布局如下:
1.从低地址到高地址为代码段,数据段,bss段,堆,栈;
2.堆向高内存地址生长;
3.栈向低内存地址生长;
4.Linux应用程序的初始地址都是0x8048000,该地址是一个虚拟地址
查看程序各段地址
运行程序后,可通过以下指令查看程序各段地址:
①ps aux #查看运行程序的PID号,假设PID号为3098;
②cat /proc/3098/maps #打印maps
但以上操作无法看到bss段,因为这里显示的是广义的数据段,已经包含了bss段。
分析bss段的指令为:readelf -S 程序名