一、编译链接过程
具体分为预编译、编译、汇编以及链接这四个过程。
(1)预编译:处理预编译指令;include展开;进行宏替换;删除所有注释。此过程结束后,生成.i文件。
(2)编译:进行词法、语法的解析;代码优化;汇总符号;生成汇编指令。此过程结束后,生成.s文件。
(3)汇编:将汇编指令翻译成二进制;生成各个section;生成符号表。此过程结束后,生成.o文件。
(4)链接:合并所有section,调整section的起始位置及大小,进行符号解析,给符号分配虚拟地址;符号重定位。此过程结束后,生成a.out文件。
gcc分步完成:
(1)gcc -E main.c -o main.i
(2)gcc -S main.i ——>main.s
(3)gcc -c main.s ——>main.o
(4)gcc main.o -o main ——>main(可执行文件)
二、虚拟地址空间分配
Linux进程地址空间分布图如下所示:
text段:存放程序执行代码的一段内存区域。
rodata段:存放的是只读数据。
data段:通常存放已被初始化的全局变量和已被初始化的静态变量。
bss段:通常存放未被初始化的全局变量和未初始化的静态局部变量。
heap堆:存放进程运行中被动态分配的内存段。
stack栈: 存放程序临时创建的局部变量。