Linking
Example C Program
Static Linking
Why Linkers?
那么我们为什么这样做的,为什么允许这种所谓的分离编译,为什么不喜欢一个包含所有代码的大文件。
Reason 1: Modularity模块化
- 允许将代码分解成更小的部分
- 创建共有函数的库,比如Math 库, 标准 C 库
Reason 2: Efficiency效率
- 分离编译,只改变一个源文件,编译后再连接整合;不需要重新编译其他文件
- 使用标准库中的所有功能,可以将它们放在一起
What Do Linkers Do?
在符号解析阶段,链接器将符号引用和符号定义相关联,这中间可能会有一些问题,比如在多个模块中,你可能会声明一个有相同名称的全局变量,链接器必须决定将其中的某个定义用于所有后续索引。
在重定位步骤器件,链接器会决定当程序运行时,每个符号最终将位于x中的存储区的哪里,并且它将那些绝对存储器位置绑定到符号。
Three Kinds of Object Files (Modules)
Linker Symbols
Step 1: Symbol Resolution
How Linker Resolves Duplicate Symbol Definitions
Linker’s Symbol Rules
Step 2: Relocation
Relocation Entries
这里的重点是链接器有足够的信息来实际填充正确的地址。
Packaging Commonly Used Functions
Modern solution: shared libraries
Dynamic Linking at Load-time
在分享库的解决办法中,我们首先要创建一个共享库而不是一个archive文件,我们创建一个.so文件,使用gcc的共享参数-shared
(到这里我听的人晕了哈哈哈哈)
Case study: Library interpositioning
库打桩的目的是截获来自库的函数调用,以及处于某种原因截获它们后做一些事情,我们通常想要做的就是截获一个函数调用,也许记录一些统计数据或者是做一些错误检查。
Some Interpositioning Applications
老师说这是一种非常酷的技术,但是我全程(懵逼)!之后有时间再看一次吧,应该会懂的更多一点。