
#include
#include
int g_unval;
int g_val = 100;
int main(int argc, char *argv[], char *env[])
{
printf("code addr : %p\n", main);
const char *p = "hello bit!";
printf("read only : %p\n", p);
printf("global val : %p\n", &g_val);
printf("global uninit val : %p\n", &g_unval);
char *q1 = (char *)malloc(10);
char *q2 = (char *)malloc(10);
char *q3 = (char *)malloc(10);
char *q4 = (char *)malloc(10);
printf("heap addr : %p\n", q1);
printf("heap addr : %p\n", q2);
printf("heap addr : %p\n", q3);
printf("heap addr : %p\n", q4);
int a = 0;
static int b = 0;
int c = 0;
printf("stack addr : %p\n", &p);
printf("stack addr : %p\n", &a);
printf("b: stack addr : %p\n", &b);
printf("stack addr : %p\n", &c);
printf("args addr : %p\n", argv[0]);
printf("args addr : %p\n", argv[argc-1]);
printf("env addr : %p\n", env[0]);
return 0;
}
#include
#include
#include
int g_val = 0;
int main()
{
pid_t id = fork();
if(id < 0){
perror("fork");
return 0;
}
else if(id == 0){ //child
printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
}else{ //parent
printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
}
sleep(1);
return 0;
}


可执行程序本身,就已经被划分成了一个个的区域;方便模块化加载到内存和库文件的链接。
两者的结构布局相呼应。

目标文件链接以后就是可执行;库代码的融合、库数据的融合等。








