SLP(Chapter 13):链接和链接器

Why 学习链接器和加载器?

  • 构建大型程序
  • 避免危险的程序错误
  • 了解如何实现作用域
  • 全面了解计算机系统
  • 学会利用共享库

1 链接和链接器 基础知识

程序时间消耗 = 编译 + 链接 + 加载 + 运行
SLP(Chapter 13):链接和链接器
链接器比汇编器、编译器更早被发明、使用,即更古老

链接器的功能

链接器
可重定位的对象文件,包括引用的函数库
可执行的目标文件

SLP(Chapter 13):链接和链接器
链接包含的过程:

  1. Symbol Resolution 符号解析
  2. Combination 聚合
  3. Relocation 重定位

什么时候链接?

静态链接(编译后)
动态链接(转载、运行时)
SLP(Chapter 13):链接和链接器

2 Object file format 对象文件格式

简介

SLP(Chapter 13):链接和链接器
为什么我们把代码和数据分成不同的部分?

  • 保护代码
  • 提高捕获命中率
  • 共享内存
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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

具体格式

SLP(Chapter 13):链接和链接器

部分 存储内容 example
Header 文件属性
文件格式?段数?是否可执行?静态链接还是动态链接?起始地址?操作系统(可选_对齐方式,,如段对齐、文件对齐_)
SLP(Chapter 13):链接和链接器SLP(Chapter 13):链接和链接器
Section块 内容
.text | .data | .bss
.strtab | .shstrtab
Line, Debug
.symtab | Relocation (Rel.text & Rel.data)
SLP(Chapter 13):链接和链接器SLP(Chapter 13):链接和链接器SLP(Chapter 13):链接和链接器
Section header table 块表
块名称、长度、文件偏移量、只读 /读写
SLP(Chapter 13):链接和链接器

3 符号解析和重新定位

0. 复习

0.1 链接包含的过程:

  1. Symbol Resolution 符号解析
  2. Combination 聚合
  3. Relocation 重定位

0.2 Definition V.S. Declare V.S. Reference ?

类型 例子
数据 SLP(Chapter 13):链接和链接器
代码 SLP(Chapter 13):链接和链接器

?0.3 static keyword: storage and linkage (存储域和作用域)

SLP(Chapter 13):链接和链接器

符号解析(符号表)

目的:根据符号表 symtab 将每个符号引用与其定义关联
SLP(Chapter 13):链接和链接器
三类符号:

  • 全局符号 Global symbol
    • 强符号Strong symbol(函数名称、初始化全局变量)
    • 弱符号Weak symbol(未初始化的全局变量)
    • SLP(Chapter 13):链接和链接器
    • 规则:
      1. 强符号之间不能重名
      2. 当强符号与弱符号重名,选强符号
      3. 弱符号重名,任意选
  • 外部符号 External symbol
  • 局部符号 Local symbol

符号重定位(重定位表)

用于:修改引用对应的内存位置。
SLP(Chapter 13):链接和链接器
SLP(Chapter 13):链接和链接器SLP(Chapter 13):链接和链接器

4 加载和加载器简介

功能

SLP(Chapter 13):链接和链接器
SLP(Chapter 13):链接和链接器

怎么使用加载器?
windows:Cmd、CreateProcess()
Linux :Shell、execve()