CSAPP
从源代码到可执行程序的步骤
C预处理器将.c文件翻译成.i文件(ASCII码)
处理所有#define,#include等带井号的预编译符号,删除注释(除了#pragma编译器指令),添加行号和文件标示符以便提示错误警告等
C编译器将.i文件翻译成一个.s文件(汇编)
词法分析,语法分析,语义分析,源代码优化,目标代码生成,目标代码优化
汇编器将.s文件翻译成.o文件(可重定位目标文件)
链接器将相关的所以.o文件以及一些必要的系统目标文件组合起来生成一个可执行目标文件,同时要负责符号的解析和重定位,符号解析将目标文件中的每个全局符号都绑定到一个唯一的定义,而重定位确定每个符号最终的内存地址,并修改对那些目标的引用
静态链接:编译阶段将静态库加入可执行文件,文件大,简而言之就是可执行文件包含运行时所需的全部代码,不易于维护,只要库变了,整个可执行文件都得重新链接
动态链接:链接阶段紧紧加入描述信息,运行时在将相应的动态库(也称共享库)加载到内存,只要调用接口不变,库和代码本身就是相互独立的,动态链接还可以分为装载时链接和运行时链接,区别简单来说就是编译器是否知道进程要调用的DLL模块(动态链接库),编译动态库必须是以位置无关代码方式编译-fpic