gcc的具体使用方式
预编译 gcc -E main.c -o main.i
gcc -E list.c -o list.i
编译 gcc -S main.i list.i —> main.s list.s
汇编 gcc -c main.s list.s —> main.o list.o
链接 gcc list.o -->a.out
gcc main.o list.o -->main
编译和链接:
预编译(生成 * .i 文件)
1> 将所有的 “#define” 删除,并且展开所有宏;
2> 处理掉所有条件预编译指令如:“#if”、“#ifdef”、“#elif”、“#else”、“#endif”;
3> 处理 “#include”指令,这是一个递归过程;
4> 删除所有的注释 “//” 和 “/* * */”;
5> 添加行号和文件名标识;
6> 保留所有的 #pragma 编译器指令,待编译器使用;
编译(生成 *.s 文件)
把预处理完的文件进行一系列的词法分析,语法分析,语义分析及优化后生成相对应的汇编代码文件。
汇编(生成 *.o 文件,也叫目标文件)
汇编器是将汇编代码转变成机器可以执行的指令,每一个汇编语句几乎都对应一条机器指令。
链接(生成 *.exe 文件,也叫可执行文件)
1> 地址和空间分配;
2> 符号解析;
3> 符号重定位;
程序的运行
- 创建虚拟地址空间到物理内存的映射(创建内核地址映射结构体),创建目录和页表
- 加载代码段和数据段
- 把可执行文件的入口地址写到 CPU 的 pc 寄存器里面