对于可执行文件的内存,我们通过下面的程序来理解
#include<stdio.h>
int m; //0 0x404050 未初始化的数据段bss
int n = 2; // 0x402000 数据段
static int k; // 0x404020
static int l = 16; // 0x402004
char *r; //nul 0x0
char *s = "hello world"; // 0x403000 rdata
char array3[15]; // 0x404040
char array4[15] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; // 0x40200c
void insert()
{
int t; //随机 0x60cc6c 堆栈段
int a = 1; // 0x60cc68
static int c; // 0x404010
static int d = 3;// 0x40201c
char *o; // 0x
char *p = "hi"; // 0x40300c
char array[15]; // 0x60cc50
char array1[15] = {0};//0x60cc40
printf(" t:%p %d\n",&t,t);
printf(" a:%p %d\n",&a,a);
printf(" c:%p %d\n",&c,c);
printf(" d:%p %d\n",&d,d);
printf(" o:%p %s\n",o,o);
printf(" p:%p %s\n",p,p);
printf(" array:%p %d\n",array,array[1]);
printf("array1:%p %d\n",array1,array1[1]);
}
int main()
{
int i;
printf(" i:%p %d\n",&i,i);
printf(" m:%p %d\n",&m,m);
printf(" n:%p %d\n",&n,n);
printf(" k:%p %d\n",&k,k);
printf(" l:%p %d\n",&l,l);
printf(" r:%p %s\n",r,r);
printf(" s:%p %s\n",s,s);
printf("array3:%p %d\n",array3,array3[0]);
printf("array4:%p %d\n",array4,array4[0]);
insert();
return 0;
}
对于可执行文件,我们可以使用nm工具查看其内存分布(即:nm -s a.out
),对于nm工具的使用,我们可以自行去man nm
使用,数据在内存中的大概分布为: