C程序是如何运行的

C程序是如何运行的

——读《程序员的自我修养—链接、装载与库》有感

以Linux系统为例

程序运行如下:
flowchart LR .c-- 预处理 ---> .i -- 编译 ---> .s -- 汇编 --->.o -- 链接 ---> ELF -- 装载 --->运行main函数
文件简介:
  • .c — .s:为文本文件,仅代码部分。
  • .o:属于ELF(可链接可执行文件),经过链接后形成ELF文件集合,仍为ELF。
  • CRT:运行库,多个.o文件集合,构建运行环境。
过程简介:
1. 预编译:处理"**#**",删除注释及空格,实现文本替换,输出文件仍为C代码。
 	1. 如#include <stdio.h> 仅是把"#include <stdio.h>"替换为stdio.h的文件。
2. 编译:通过词法,语法,语义分析形成汇编代码(文本文件)。
3. 汇编:汇编码汇编成机器码,增加二进制空间存储文件信息(二进制文件),构建虚拟空间,形成ELF文件。
 	1. 虚拟空间:为物理空间的扩展,仅存在与理论上,执行程序时逐步映射到物理内存,减少物理内存的浪费。
 	2. 增加的信息:
     	1. 如字符串表,以数组的形式存储字符串,执行时输入字符串以数组下标形式输出,无需拷贝复制。
     	2. 又如符号表,包含人为定义的符号信息(比如所在的虚拟空间),为重定位提供条件。
4. 链接:实现重定位,合并二进制文件。
 	1. 重定位:实现虚拟空间合并,多个文件的相同类型合并在同一段,相同符号(没有虚拟空间的指向有虚拟空间的位置)分配虚拟空间。
5. 装载:虚拟内存物理化(含CRT初始化环境),转换为进程执行。
 1. 初始化环境:在物理内存中构建堆,栈;初始化全局变量等。
图解ELF:

img

原图

posted @ 2022-05-06 11:47  xvilivo  阅读(269)  评论(0)    收藏  举报