1.c
2.c
…
main.c
.
.
.
1.o
2.o
…
main.o
.
.
.
.
.
.
编译阶段
a.out链接阶段
文件头部
代码段 1
数据段 1
符号表 1
...
.rel.text 1
.rel.data 1
...
文件头部
代码段 2
数据段 2
符号表 2
...
.rel.text 2
.rel.data 2
...
文件头部
代码段 main
数据段 main
符号表 main
...
.rel.text main
.rel.data main
...
1.o
……
库文件
文件头部
代码段 1
代码段 2
...
代码段 main
库文件
数据段 1
数据段 2
...
数据段 main
符号表 1
符号表 2
...
符号表 main
...
2.o
main.o
a.out
各个目标文件中的函数以及变量地址相对于原始文件的偏移
地址均为0x00,而链接过去后生成的目标文件中改函数的实际地
址则变为链接后的链接地址加上该函数的偏移量。
此处给出各目标文件中某一个函数的地址,并非实际文件中
函数的地址,仅以此说明链接器的处理过程
0x0
Link_addr
addr func
0xac im1(void)
addr func
0x28 im2(void)
addr func
0x11 main(void)
0x0
0x0
0x0
addr func
Link_addr+0xac im1(void)
addr func
Link_addr+len(代码段1) + 0x28 im2(void)
addr func
Link_addr+len(代码段1、2、...) +0x11 main(void)
重定位阶段
a.out
文件头部
代码段 1
代码段 2
...
代码段 main
库文件
数据段 1
数据段 2
...
数据段 main
符号表 1
符号表 2
...
符号表 main
...
a.out
文件头部
代码段 1
代码段 2
...
代码段 main
库文件
数据段 1
数据段 2
...
数据段 main
符号表
...
a.out
根据这些段保存的每个文件中
所需要重定位的符号将对应目
标文件链接过去的函数、变量
和符号的地址进行修正
文件头部
...
.rel.text 1
.rel.data 1
...
文件头部
...
.rel.text 2
.rel.data 2
...
文件头部
...
.rel.text main
.rel.data main
...
1.o
……
2.o
main.o
1 2 3
Author: Imagine Miracle
Version: v1.1
Date: 2022-05-09
2
3
2
3