CSAPP 和 CMU Introduction to computer system (CS 15-213 2015 fall) 的笔记。
相关资料
linking
从这章开始,后续主要是将程序和操作系统之间的交互关系。
linking(链接)是指将各种代码和数据片段收集并组合成一个单一文件的过程,然后加载到内存并执行。链接可以发生在编译,加载,甚至运行时。
链接使得我们可以建立库,而不必每次编译一个大文件。
学习链接知识的作用:
- 构造大型程序
- 避免bug
- 理解语言的作用域
- 理解其他的系统概念
- 利用共享库
链接器干什么?
- 符号解析:全局变量和函数。存储在符号表中。
- 重定位:将数据和代码合在一个节上。将内存分配给新的节。修改节中对符号的引用。
Executable and Linkable Format (ELF)
ELF是标准的二进制格式的目标文件。
三种目标文件
ELF 文件格式
符号解析
- 局部变量:局部变量存在栈中,局部静态变量存在.bbs(未初始化),.data中初始化的。
若变量之间有重复定义的(可能发生在不同文件之间,会有比较的关系,而这有可能导致bug,比如说两个未初始化的同名全局变量。所以尽可能使用静态全局变量,不能被其他模块引用,减少bug发生。)
Loading Executable Object Files
将可执行文件加载到内存
lib
static lib
静态库,将相关的目标文件重定位到一个文件(archive)。例如: libc.a libm.a
但是使用静态库需要注意引用的顺序,若存在依赖,被依赖的要前。
而且静态库会造成存储和运行时的重复。而且需要定时更新和维护。
share lib
共享库是一个目标模块,在运行或加载时,可以加载到任意的内存地址,并和内存中的程序链接起来。linux中的.so,windows中的.ddl。
值得注意的是,使用共享库,代码和数据节并没有被复制到可执行目标文件中,知识链接器复制了一些重定位和符号表的信息,使得运行时可以引用共享库中的代码和数据。
Library Interpositioning
库插入?运行程序拦截对共享库的调用。
可以发生在编译,链接,运行时。
可以用来监控函数被调用次数,以及输入输出。
- 本文作者: SFARL
- 本文链接: sfarl.github.io/2020/09/21/csapp-chapter7/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!