设计 Wild 的增量链接 | David Lattimore

这是关于设计 Wild 的增量链接的文档,主要内容如下:

  • 设计目的:目标是实现快速的增量链接,希望在编辑测试用例后 10ms 内看到测试的通过/失败状态,这是热代码重载的一步,可提高链接速度且减少重新处理输入等操作。
  • 范围限制:暂不考虑归档语义、未使用节的垃圾回收、删除旧合并字符串、严格排序节等复杂部分,先专注于增量链接。
  • 配置增量链接:添加--incremental标志或设置环境变量WILD_INCREMENTAL=1来启用,可能还会添加配置用于设置输出节的额外增长空间百分比。
  • 对象差异计算:理想情况下编译器应传递已更改的部分,但目前需自己计算,分计算差异和应用差异两阶段,通过检查修改时间戳确定更改文件,匹配新旧对象文件的节,对于 Rust 的.rlib 文件需直接比较字节。
  • 持久状态:需将各种状态写入磁盘,如基于输出文件命名的目录、旧输入文件的副本、索引文件等,且需保证磁盘和内存格式相同。
  • 符号相关映射与表:需持久化符号名到符号 ID 的映射,短期可用sled,长期考虑odht;当前存储符号地址等信息的表可改为映射文件;还需存储重定位反向索引、动态重定位反向索引、异常帧信息、字符串合并索引等。
  • 算法流程:增量链接实现后,链接器有三种操作模式,增量更新的大致算法包括检查标志变化、确定更改文件、计算差异、分配地址、更新符号解析等一系列步骤,若某阶段失败则回退到初始增量链接。
  • 测试:通过扩展现有测试系统,编译多个版本的输入文件,使用linker-diff比较输出,测试增量链接效果。
  • 反馈与感谢:欢迎提出想法和问题,感谢 github 赞助商的支持,同时提供了 reddit 讨论线程的链接。
阅读 5
0 条评论