C语言 - 编译链接
一.翻译环境和运行环境
1.翻译环境:将.c源代码 --> 可执行机器指令。
2.运行环境:执行已生成好的可执行程序,程序被操作系统加载进内存,从main函数开始执行。
二.翻译环境
翻译环境由编译和链接两大环节组成,编译又分为预处理,编译,汇编三个过程。
整体流程如下:

1.预处理
(1)输入.c --> 输出.i
(2)命令:gcc -E test.c -o test.i
(3)主要处理:#include头文件展开,#define宏替换,删除注释,处理条件编译#ifdef/#endif。
2.编译
(1)输入.i --> 输出.s。
(2)命令:gcc -S test.i -o test.s。
(3)主要处理:语法检查,语义分析,生成汇编指令。
3.汇编
(1) 输入.s --> 输出.o 。
(2)命令:gcc -c test.s -o test.o
(3)主要处理:把汇编指令翻译成CPU原生机器代码,尚未解决符号地址。
4.链接
(1)输入:多个.o目标文件 + 系统库
输出:可执行文件Linux a.out/ Windows exe)
(2)命令:gcc test.o -o test
(3)工作:解析函数,全局变量符号;合并段(代码段,数据段),连接标准库(printf等)。
三.运行环境
1.程序必须载入内存。在有操作系统环境中,一般由这个操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
2.程序的执行便开始。接着便调用 main 函数。
3.开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
4.终止程序。正常终止 main 函数;也有可能是意外终止。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)