目录
一、程序的翻译环境和运行环境
在ANSI C的任何一种实现中,存在两个不同的环境。
1、翻译环境,在这个环境中源代码被转换为可执行的机器指令。
2、执行环境,它用于实际执行代码。
二、翻译环境
1.组成一个程序的每个源文件(.c文件)通过编译过程分别转换成目标代码(.obj文件)。
2.每个目标文件(.c文件)由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序(.exe文件)。
3.链接器同时也会引入标准C函数库(Libraries,即链接库)中任何被该程序所用到的函数,而且它可以搜索程序员个人 的程序库,将其需要的函数也链接到程序(.exe文件)中。
翻译环境(从.c到.exe) = 编译(编译器,即cl.exe) + 链接(链接器,即link.exe)
VS 2019这种叫集成开发环境,包含了这些小的编译器、链接器等等。
1、编译的几个阶段
编译(从.c到.obj) = 预处理(也叫预编译,.i文件) + 编译(.s文件) + 汇编(.o文件)
1.预处理阶段
gcc test.c -E > test.i --- 预处理之后就停止,并且写在test.i文件中。
1)完成了头文件的包含,比如说#include。
2)完成#define定义的符号和宏的替换。
3)注释的删除
预处理阶段完成的都是文本的操作。
2.编译阶段
gcc test.i -S > test.s
作用是:把C语言代码转换成汇编代码。
1)语法分析
2)词法分析
3)语义分析
4)符号汇总
3.汇编阶段
gcc test.s -c > test.o ( test.obj )
作用是:
1)把汇编代码转换成机械指令(二进制指令)。
2)生成符号表
test.o文件是elf格式的,工具readelf是可以看懂test.o文件的。
命令:readelf test.o -s ---- 能看见全局变量
4.符号汇总与生成符号表
不同的.c文件各自进行符号汇总,然后将所有.c文件的符号汇总生成符号表。
2、链接
把多个目标文件和链接库进行链接。
1.合并段表 --- 也是elf格式
2.符号表的合并和重定位 --- 保留有效的符号地址
推荐图书《程序员的自我修养》
三、运行环境
程序执行的过程:
1、程序必须载入内存中
在有操作系统的环境中:一般这个由操作系统完成。
在独立的环境中,程序的载入必须由手工安排(比如说嵌入式);
也可能是通过可执行代码置入只读内存来完成。
2、程序的执行开始
调用main函数。
3、开始执行程序代码
这个时候程序将使用一个运行时堆栈,存储函数的局部变量和返回地址。
程序同时也可以使用静态内存,存储于静态内存中的变量,在程序的整个执行过程 一直保留他们的值(在静态区)。
4、终止程序
正常终止main函数;也有可能是意外终止。