从零开始实现链接器

《从零开始实现链接器》是 PLCT Lab 推出的一门公开课。在本课程中,我们会从零开始使用 Go 语言实现一个 RV64GC(RISC-V 64 位)架构的链接器,可以正确地链接相对简单的 C 程序。通过学习本课程,我们可以掌握链接器最核心部分的工作原理。

本课程在 GitHub 上开源。为了确保课程的顺利进行,我们提前实现了本课程中最终会实现的参考代码,放在了 main 分支中。在 course 分支中则按照课程记录放有每节课的代码,每节课一个 commit。

课程资源

Bilibili 视频合集:从零开始实现链接器(2022秋季),每节课的链接和简介参见课程大纲。

QQ 群:583125002

微信群:添加微信 fangzhang1024 标注 rvld,会拉你进群。

课程答疑

如果你对课程内容有任何疑问,请到课程仓库的 Issues 区发起 issue。

常见问题

  1. Go 版本

    如果你是从非官方源下载的 Docker 镜像,请运行 go version 检查 Go 的版本,确保版本为 1.19+,否则代码很可能不能通过编译。

课程大纲

第一课:搭建开发环境、初始化项目、开始读取 ELF 文件

在本节课中,我们使用 Docker 搭建了 Go 语言的开发环境,并使用 Go Mod 对项目进行了初始化。然后我们简单介绍了 ELF 文件的结构,并开始读取 ELF 文件。

视频链接BV1D8411j7fo 时长:01:00:37

环境搭建相关的命令

参考链接

Executable and Linkable Format - Wikipedia

ELF64 File Header

 

第二课:继续读取 ELF 文件

在本节课中,我们继续读取并解析了 object file 中几个重要的 section 类型。

视频链接BV11G4y147bo 时长:00:45:29

参考链接:

Executable and Linkable Format - Wikipedia

Sections - System V Application Binary Interface 2001

 

第三课:解析链接器参数

在本节课中,我们完成了链接器参数的解析。

视频链接BV1nY411d7pu 时长:01:00:55

 

第四课:解析静态链接库文件

在本节课中,我们完成了静态链接库文件的解析。

视频链接BV1oW4y1u7vX 时长:00:51:04

参考链接:

ar (Unix) - Wikipedia

 

第五课:解析未定义符号,移除未使用文件

在本节课中,我们根据前面课程中已经读取到的信息解析未定义 symbol 的位置以及删除掉无用的 object 文件。

视频链接BV1KM411U76g 时长:01:21:35

 

第六课:处理 Mergeable Sections

在本节课中,我们开始处理 mergeable sections。

视频链接BV11P4y1q7GS 时长:01:28:55

 

第七课:开始写文件

从本节课开始,我们开始可执行文件的写入。在本节课中,我们完成了 ELF header 的写入。

视频链接BV1HR4y1D72S 时长:42:39

 

第八课:处理 Output Sections

在本节课中,我们继续来写文件,上节课实现了 ELF header 的写入,这节课我们开始处理 output sections 的写入。

视频链接BV1Cv4y1i7WC 时长:44:56

 

第九课:继续处理 Output Sections

在本节课中,我们给 output sections 排序,并计算它们的虚拟地址。

视频链接BV1F84y1e7eN 时长:29:30

 

第十课:Phdr 和 Merged Sections

在本节课中我们给 merged sections 收尾,并支持了 Phdr 的写入。

视频链接BV1vY411m7yS 时长:53:50

 

第十一课:处理重定向,课程回顾

在本节课中,我们处理了重定向,并做了个简单的课程回顾。

视频链接BV1q14y1G7y7 时长:01:08:12

 

参考链接:

RISC-V ELF Specification

riscv-card

Copyright @ 2022 ksco
Generated by Typora