CSAPP
从源代码到可执行程序的步骤
C预处理器将.c文件翻译成.i文件(ASCII码)
处理所有#define,#include等带井号的预编译符号,删除注释(除了#pragma编译器指令),添加行号和文件标示符以便提示错误警告等
C编译器将.i文件翻译成一个.s文件(汇编)
词法分析,语法分析,语义分析,源代码优化,目标代码生成,目标代码优化
汇编器将.s文件翻译成.o文件(可重定位目标文件)
链接器将相关的所以.o文件以及一些必要的系统目标文件组合起来生成一个可执行目标文件,同时要负责符号的解析和重定位,符号解析将目标文件中的每个全局符号都绑定到一个唯一的定义,而重定位确定每个符号最终的内存地址,并修改对那些目标的引用
静态链接:编译阶段将静态库加入可执行文件,文件大,简而言之就是可执行文件包含运行时所需的全部代码,不易于维护,只要库变了,整个可执行文件都得重新链接
动态链接:链接阶段紧紧加入描述信息,运行时在将相应的动态库(也称共享库)加载到内存,只要调用接口不变,库和代码本身就是相互独立的,动态链接还可以分为装载时链接和运行时链接,区别简单来说就是编译器是否知道进程要调用的DLL模块(动态链接库),编译动态库必须是以位置无关代码方式编译-fpic
ELF可重定向目标文件结构(.o) 图7-3
可执行目标文件 图7-13
加载器(exec函数家族来调用)将可执行目标文件中的代码段和数据段从磁盘复制到内存中,然后跳转到入口点(ELF头中)来运行程序
程序运行时内存映像(进程地址空间)—图7-15 栈位于内核内存(不可见)之下,栈的增长是伴随着地址减小,堆的增长伴随着地址的增大,中间还有一块区域是共享库的内存映射区域
打桩机制就是截获动态库函数的调用,转而执行年自己的代码,你可以创建该函数的包装函数,以此可以方便追踪信息