mold源码阅读十六 回顾整个流程
Homura 我摸到了!

Untitled

pixiv:80173499

内容回顾

在以往十六期的博客中,我们沿着mold中的main函数一路追寻了下去,直到结束。

首先我们熟悉了文件结构以及项目目录等,查看了如何读取不同类型的文件,其中最关键的是objdso,lto三种,分析了不同类型的差异及其特有的处理方式。同时在查看如何解析elf的过程中了解elf头,了解了mold对象的构造,以及elf中信息查找段、符号等的方式。

当我们收集齐输入的文件信息后就要开始对这些文件进行处理。首先做的是dso去重,避免多个同名dso导致的错误。接下来是最重要部分:符号信息解析。符号相关的过程有许多包括符号决议符号的导入导出动态链接的符号的版本确定处理未解析的符号等等。之后还对mergeable的段进行合并

处理完符号相关的信息后开始创建输出文件,准备将许多input section合成一个output section。此时需要对于常见synthetic符号与段的构造,并且将它们放到输出的文件中。在实际输出文件之前还需要确定文件内部布局,主要对段排序,其中包括chunks之间排序,以及output section内部保存的input section的顺序。

当文件布局确定后我们就可以创建rel相关的段,将符号写入对应的符号表,计算段内的一些信息,对部分synthetic段构造等等。之后更新section对应的shdr,以及更新段的虚拟地址,对synthetic符号的值进行修正等。通过这些操作来确定下文件载入内存中的布局。

最后再将这些拷贝到输出文件中。在拷贝的同时还做了许多操作,比如说段的重定位,填写ehdr以及其他synthetic段中的信息。

在整个过程中也有许多检查,比如符号重复定义或者未定义。还有许多优化,例如对section进行标记来回收无用段安排输出段的位置使得相同读写权限的段尽可能在一个页内,消除重复的ehframe项,段压缩等等。

以上就是链接器mold的概况。

想法

最初会开始看链接器的实现是因为感到好奇,加上之前每次遇到链接相关的问题第一反应是头大,觉得解决不了。后来看到mold这个链接器,其中的代码量还在我能串一遍理解的范畴,因此开始了读代码的过程。读的时候做着记录,后来想着干脆开一个系列博客,我在读的时候经常容易跳过某些细节,写博客的过程中会强制自己对这些细节进行强制思考。

经过了十六期的文章后,整个mold的链接过程基本上就全部过了一遍,而我对于链接器工作的整个流程有了更详细的认知。以前对于链接的模糊印象就是简单的相似段合并,符号解析(但是不知道符号解析具体是在做什么),生成可执行文件或者library,但现在我对于这些部分有了更多的了解,并且还知道了链接过程不止有这些,还有包括synthetic的符号和段的处理,虚拟地址计算,重定位操作等等。

除此之外还看到了许多未曾想到的东西,在看到一些处理过程后,对动态链接以及加载的过程也有了更多的了解,还有一些之前从未想过能如何联系到一起的想法,比如说相同attribute的段放在一起,避免单独成页,减少运行时的内存等。

虽然学到了很多东西但是还是有很多地方其实是一知半解,阅读源码远不如实际写来困难,虽然能够大致讲出整个链接器的结构是怎样的,但是对链接器来说最重要的还是各种边边角角的细节,或者意想不到的东西都会在写的过程中出现。我现在在造各种轮子玩,想自己做出各种东西并且串联起来,或许会有一天也会需要造自己的linker吧。

在源码通读的过程可能花了过久的时间,有些低效。但很多东西我一开始确实没意识到,很多问题都没有提出,不过查看了前面的这些过程后,现在开始阅读不仅是了解了有什么,还让我能够提出一些问题。

在博客内容写作的过程也不太熟练,最近也是为自己博客写作感到焦虑。不论是内容详细程度,以及排版,内容划分做的都不太好。在学习的时候看到maskray聚聚的文章,多少受到了一些启发,意识到自己过于注重于原来的代码怎么写,对于代码背后的原理关注的相对较少,这其实才是要学习的本质内容,又不是学习代码技巧。在后面几期也在有意识的进行改正,之后写其他阅读代码的博客时也会继续试着这样来做。

排版上试了不同的方案,比如说最早是放一段读一段,后来又尝试一次讲完一个流程然后贴整段代码,之后再对其中需要更加深入的细节加入小标题来做。不过感觉怎么都很别扭,markdown似乎没什么办法分成代码和文字两列,最后还是觉得先讲清楚流程再放代码了。

后续

如果后续勤快的话还会继续更新一些东西,除了这样通读外,还想针对特定主题进行贯穿一遍,而且还有一些没有详细看细节但是比较重要的东西。(总觉得说出这样的话就会懒得更了…)

比如说各种synthetic的符号更详细的介绍, 梳理做的各种优化,header的生成,为动态链接做的准备(got,plt等),数据压缩与解压,为重定位所做的各种操作,最终产物的地址计算与关联等等,这些其实都还比较模糊,没有一个确切的印象,需要单独串联起来理解整个过程。

  • 本文标题:mold源码阅读十六 回顾整个流程
  • 本文作者:Homura
  • 创建时间:2023-08-05 18:17:42
  • 本文链接:https://homura.live/2023/08/05/mold/mold-16-summary/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!