编译连接运行原理(C++ 和 linux gcc使用)

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文件,名字可自取,可执行程序名字也可自取)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值