高性能链接器-Mold
2022-04-30 21:46:30 阿炯

Mold 是现代链接器(Linker),Unix 链接器的替代品,它比 LLVM lld 链接器快好几倍,而 LLVM lld 链接器是作者早些年写的。采用C/C++开发AGPLv3协议下授权,从版本2.0后变更为MIT协议。


A Modern Linker.


下图为 GNU gold、LLVM lld、mold 性能图



如何构建

mold 是用 C++20 编写的,所以需要最新版本的 GCC 或 Clang。默认情况下,mold安装到/usr/local/bin.

最新版本:1.2
Mold 于2022年4月下旬发布了 1.2.1 版本,带来以下更改:
修复 --gdb-index 中的各种错误。
为了与 LLVM lld 兼容,Mold 现在可以识别 --thinlto-cache-dir 和 --thinlto-cache-policy。
Mold 现在可以处理 TLS 常用符号,GCC 有时会为线程局部变量创建这样的符号。
在某些极端情况下,Mold 为同一符号创建了一个非版本化符号和一个版本化符号,即使一个符号被版本化,所有同名符号也必须被版本化。
修复:Mold 用于将符号的 PLT 地址而不是其地址写入 .symtab。
Mold 现在可以处理超过 219 个符号的输入文件。
/usr/local/libexec/mold/ld 现在安装为相对符号链接,而不是绝对符号链接。
更多信息请参考更新公告

最新版本:1.8
Mold 于2022年12月下旬发布了 1.8 版本,带来了更多新功能支持:
重新实现了其可重定位(-r /--relocatable)特性,以提高性能并增加与 GNU 链接器的兼容性
添加了 --relocatable-merge-sections 选项
添加了 [no] dynamic-undefined-weak 选项
添加了 [no-] undefined-version 选项
对符号类型不匹配的情况发出警告
合并不同 x86 属性的 .gnu.note.property 部分
--wrap 模式现在可以在启用链接时优化 (LTO) 的情况下工作
各种其他修复和改进。
此外 Mold 1.8 放弃了对用户的实验性 Apple macOS/iOS 支持,MacOS 用户需要使用 Sold 链接器( Mold 链接器的商业版本)。更多信息可参见更新公告

最新版本:2.0
2023年7月下旬,mold 正式发布了 2.0 版本。其中一项重大变化是修改开源 License:将 AGPL 更改为 MIT。此前 mold 曾使用 AGPL 来解决商业融资问题 —— 但最后并没有达到预期效果。因此 mold 2.0 将 AGPL 代码重新授权为 MIT。其创始人表示:通过 2.0.0 版本,我们已将许可证从 AGPL 转换为 MIT,旨在扩大链接器的用户群。这不是一个容易的决定,因为那些一直关注我们进展的人都知道,我们一直在尝试通过 AGPL/商业许可双重许可方案为项目实现盈利。不幸的是,这种方法没有达到我们的预期。变更开源 License 代表了我们对这一现实的接受。我们不想坚持一个效果不佳的策略。其他变化:
1.此前 mold 无法使用 --relocatable 选项生成包含超过 65520 个部分的目标文件。现在该错误已被修复。
2.mold 现在将 -undefined 解释为 --undefined 的同义词,而不是 -u ndefined。这似乎不一致,因为 -ufoo 通常被视为 -u foo(这是 --undefined foo 的别名),但这是 GNU 链接器和 LLVM lld 的行为,因此他们优先考虑兼容性而不是一致性。
3.-nopie 现在作为 --no-pie 的同义词处理。


项目主页:https://github.com/rui314/mold