链接过程
1. 空间与地址分配
1.1 扫描所有的输入目标文件,获得 输入文件中的 各个段长度(Size),属性(Attribute),位置(File off).
1.2 按规则将 输入文件排序 的段 排序 并合并
1.3 合并前 , 计算 "每个输入文件中的段" 在内存中的位置(LMA&VMA)
1.4 合并后 , 计算 "合并后的" 段 在输出文件的位置(File off)和长度(Size).
2. 符号管理
2.1 确定符号地址(根据该符号在所属文件/段的偏移,和该段的LMA&VMA确定)
2.2 收集 输入文件中的符号定义和"引用".放到一个全局符号表(包括符号名和LMA&VMA)
3. 符号解析与重定位
3.1 输入文件中填充的引用的函数符号地址为0xfffffffc , 填充的 引用的变量符号的地址 为 0x00000000
3.2 在重定位表中找到这些 信息(偏移地址A,类型B和符号C).
3.3 根据 "全局符号表" 和 符号C 获得符号C的真实 地址
3.4 将 偏移地址A处的32字节 填充为 符号C的真实地址.
复杂问题
文件中的链接指令
命令行
链接脚本
外围问题
objdump 各个字段解析
objdump 是一个用于查看目标文件(如可执行文件、目标文件、共享库等)内容的命令行工具。它能够以十六进制或可读的汇编形式显示目标文件的内容,包括各种部分和节的信息。以下是 objdump 命令的一般用法及其字段解析:
objdump -h <file>
其中,-h 选项用于显示目标文件的节头表(Section Headers)。执行这个命令后,会显示类似下面的输出:
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 0000002c 0000000000401000 0000000000401000 00001000 2**4
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
1 .data 00000008 000000000060102c 000000000060102c 0000102c 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000004 0000000000601034 0000000000601034 00001034 2**2
ALLOC
这些字段的含义解释如下:
Idx:节的索引号。
Name:节的名称。
Size:节的大小。
VMA:节在内存中的起始虚拟地址(Virtual Memory Address)。
LMA:节在加载时的起始地址(Load Memory Address)。
File off:节在文件中的偏移量。
Algn:对齐方式。
后面的一行描述了节的属性(Attribute):
CONTENTS:表示该节包含数据或代码。
ALLOC:表示该节在内存中被分配。
LOAD:表示该节被加载到内存中。
RELOC:表示该节可能包含可重定位的位置。
READONLY:表示该节是只读的。
CODE:表示该节包含可执行代码。
DATA:表示该节包含初始化的数据。
通过 objdump 可以更深入地了解目标文件的结构、节、符号表、重定位表以及代码段等信息。