SLP(Chapter 13):链接和链接器
Why 学习链接器和加载器?
- 构建大型程序
- 避免危险的程序错误
- 了解如何实现作用域
- 全面了解计算机系统
- 学会利用共享库
1 链接和链接器 基础知识
程序时间消耗 = 编译 + 链接 + 加载 + 运行
链接器比汇编器、编译器更早被发明、使用,即更古老
链接器的功能
链接包含的过程:
- Symbol Resolution 符号解析
- Combination 聚合
- Relocation 重定位
什么时候链接?
静态链接(编译后)
动态链接(转载、运行时)
2 Object file format 对象文件格式
简介
为什么我们把代码和数据分成不同的部分?
- 保护代码
- 提高捕获命中率
- 共享内存
Name | Full Name | OS | e.g. | View Too |
---|---|---|---|---|
ELF | Executable And Linkable | Linux | .o / .so | objdump/readelf |
PE | Portable Executable | Windows | .exe/.dll/.ocx/.sys/.com | PETool |
COFF | Common file format | .obj | objdump/dumpbin |
Type | Mean | Linux | Windows |
---|---|---|---|
可重定位文件 Relocatable File | 包含适合于与其他目标文件链接来创建可执行文件或者共享目标文件的代码和数据 | .o | .obj |
可执行文件 Executable File | 包含适合于执行的一个程序,此文件规定了exec()如何创建一个程序的进程映像 | /bin/bash文件 | .exe |
共享目标文件 Shared Object File | 包含可在两种上下文中链接的代码和数据。首先链接编辑器可以将它和其它可重定位文件和共享目标文件一起处理,生成另外一个目标文件。其次,动态链接器(Dynamic Linker)可能将它与某个可执行文件以及其它共享目标一起组合,创建进程映像。 | .so | .dll |
作者:jdzhangxin
链接:https://www.jianshu.com/p/9884c8823712
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
具体格式
部分 | 存储内容 | example |
---|---|---|
Header | 文件属性 文件格式?段数?是否可执行?静态链接还是动态链接?起始地址?操作系统(可选_对齐方式,,如段对齐、文件对齐_) |
|
Section块 | 内容 .text | .data | .bss .strtab | .shstrtab Line, Debug .symtab | Relocation (Rel.text & Rel.data) |
|
Section header table | 块表 块名称、长度、文件偏移量、只读 /读写 |
3 符号解析和重新定位
0. 复习
0.1 链接包含的过程:
- Symbol Resolution 符号解析
- Combination 聚合
- Relocation 重定位
0.2 Definition V.S. Declare V.S. Reference ?
类型 | 例子 |
---|---|
数据 | |
代码 |
?0.3 static keyword: storage and linkage (存储域和作用域)
符号解析(符号表)
目的:根据符号表 symtab 将每个符号引用与其定义关联
三类符号:
- 全局符号 Global symbol
- 强符号Strong symbol(函数名称、初始化全局变量)
- 弱符号Weak symbol(未初始化的全局变量)
- 规则:
- 强符号之间不能重名
- 当强符号与弱符号重名,选强符号
- 弱符号重名,任意选
- 外部符号 External symbol
- 局部符号 Local symbol
符号重定位(重定位表)
用于:修改引用对应的内存位置。
4 加载和加载器简介
功能
怎么使用加载器?
windows:Cmd、CreateProcess()
Linux :Shell、execve()