C++
1.预编译:
生成 .i文件(高级语言)
①处理带 # 的东西,删除#define并做文本替换;
②递归展开头文件;
③处理#if #endif等预留编译指令;
④删除注释,添加行号和文件标识;
⑤保留#pragma指令。
2.编译
生成 .s文件(汇编语言)
①词法分析(命名等规范否)
②语法分析(分析行表达式)
③语义分析(结合上下文)
④代码优化
⑤生成汇编指令
3.汇编
生成 .o文件(目标文件/可重入的二进制文件)
翻译指令(把低级语言翻译成机器语言)
强弱符号(只针对于全局变量)
强符号:已初始化的符号
弱符号:未初始化的符号
eg:
#include<stdio.h>
int a=10; //强符号
int b;//弱符号
int main()
{
printf("%d\n",a);
b=20;
}
4.链接
生成 .exe文件
①合并段和符号表,处理强弱符号。
eg:合并:a.o b.o -----→ .exe
②外部符号处理,符号解析(在符号引用的地方找到符号定义的地方)
③处理虚假偏移和地址
④符号的重定位
5.运行
①建立虚拟地址空间和物理内存的映射,创建目录和页表
②加载指令和数据到内存上
③把程序入口地址放到下一个指令寄存器
linux
文件:c→i→s→o
gcc使用:生成main可执行程序, ./main 执行
预编译
gcc -e main.c -o main.i(生成.i文件)
编译
gcc -s main.i -o main.s(生成.s文件)
汇编
gcc -c main.s -o main.o(生成.o文件)
链接
gcc -o main main.o / gcc main.o -o main
(生成main可执行程序)
运行
./main
一般在编写完代码后直接用
gcc -o main main.c(生成可执行程序)
(main.c是你编写代码的.c文件,名字可自取,可执行程序名字也可自取)