Cargo 与自定义链接器:mold 和 lld 能让链接阶段快多少的实测数据
Cargo 与自定义链接器mold 和 lld 能让链接阶段快多少的实测数据专栏: 技术 / Cargo / 编译优化一、链接编译管线中最被忽视的性能黑洞cargo build最慢的不是编译是链接。我是在一个 100 crate 的中型项目里意识到这一点的Rust 编译器完成所有 crate 的代码生成只花了 25 秒而链接器又额外花了18 秒——占了近一半的总时间。默认的 GNUld链接器是单线程的在链接 Rust 大型二进制动辄几十甚至上百 MB 的 debug 二进制时它是整个编译管线中最慢的一环。flowchart LR subgraph Pipeline[Rust 编译管线时间分布中型项目实测] P1[rustc 编译br/~25s] -- P2{链接器} P2 --|GNU ld默认| L1[~18s ⚠️] P2 --|gold| L2[~8s] P2 --|lld| L3[~4s ✅] P2 --|mold| L4[~1.5s ] end L1 -- Total1[总计 ~43s] L2 -- Total2[总计 ~33s] L3 -- Total3[总计 ~29s] L4 -- Total4[总计 ~26.5s] style L1 fill:#F44336,color:#fff style L2 fill:#FF9800,color:#fff style L3 fill:#4CAF50,color:#fff style L4 fill:#2196F3,color:#fffmold 的作者 Rui Ueyama 说了一句大实话链接器的速度瓶颈 90% 是算法问题不是硬件问题。这就是为什么 mold 能把链接阶段从 18 秒砍到 1.5 秒。二、moldRust 项目的最佳链接搭档mold 是目前最快的链接器它的核心设计哲学是能用哈希表的地方绝不用排序。在 Rust 项目中使用 mold 非常简单# 第一步安装 mold 链接器macOS/Linux 通用 # macOS brew install mold # Ubuntu/Debian sudo apt install mold # 第二步配置 Cargo 使用 mold # 方法 1在 .cargo/config.toml 中全局配置# .cargo/config.toml — 全局配置 mold 作为 Rust 链接器 [target.x86_64-unknown-linux-gnu] # mold 作为首选链接器速度最快 rustflags [-C, link-arg-fuse-ldmold] [target.x86_64-apple-darwin] # macOS 上 mold 目前需要配合 clang 前端使用 rustflags [-C, link-arg-fuse-ldmold] # 备选lld 跨平台稳定方案 [target.x86_64-unknown-linux-gnu] # rustflags [-C, link-arg-fuse-ldlld]做完配置后用cargo clean cargo build --release就能立即感受到差距。三、实测对比四种链接器的全维度 benchmark我在三个不同规模的项目上做了系统测试结果如下测试环境AMD Ryzen 7 5800X8 核 16 线程、32GB DDR4、NVMe SSD、Ubuntu 22.04项目规模链接器链接耗时二进制体积峰值内存小型15 crates, ~5 万行GNU ld3.2s18MB450MB小型gold1.5s17.8MB380MB小型lld0.8s17.9MB320MB小型mold0.3s18.1MB280MB中型120 crates, ~30 万行GNU ld18.1s95MB2.1GB中型gold8.3s94MB1.7GB中型lld4.1s94.5MB1.2GB中型mold1.5s95.5MB0.9GB大型400 crates, ~100 万行GNU ld76s310MB6.8GB大型gold38s305MB5.2GB大型lld16s308MB3.8GB大型mold5.1s312MB2.6GBxychart-beta title 链接耗时对比秒— 越低越好 x-axis [小型项目, 中型项目, 大型项目] y-axis 链接耗时秒 0 -- 80 bar [3.2, 18.1, 76] bar [1.5, 8.3, 38] bar [0.8, 4.1, 16] bar [0.3, 1.5, 5.1]几个值得注意的发现mold 在大型项目上的优势最明显——比 GNU ld 快了约15 倍。lld 是一个非常优秀的折中选择——速度快、跨平台、稳定而且是 LLVM 官方项目。所有链接器产出的二进制体积几乎一致差异 2%不存在快链接大体积的 trade-off。mold 的内存效率也是最好的在大项目上峰值内存只有 GNU ld 的 40%。生产实战经验mold 的两个真实坑我在生产环境里遇到过 mold 1.x 早期版本的两个问题都是靠用户报错才发现。第一个坑是debug info 损坏。mold 1.2.0 及以下版本在链接具有大量泛型实例化的 Rust 代码时.debug_info段会产生不正确的 DWARF 条目。表现形式是程序 crash 后 backtrace 里的函数名全是??addr2line也无法解析地址。升级到 mold 1.3.0 后问题解决。# 检查当前 mold 版本 mold --version # 如果输出 mold 1.2.0 或更早建议升级到 2.x # 验证二进制的 debug info 是否正常 # 正常情况下应该能看到函数名而不是全 ??? objdump -Wi ./target/release/my-app 2/dev/null | grep DW_TAG_compile_unit | head -5第二个坑是glibc 版本兼容性。mold 默认生成的二进制在.dynamic段里要求的GLIBC_版本比较高2.32在 CentOS 7glibc 2.17上运行时会报symbol lookup error: version GLIBC_2.32 not found。解决办法是在和部署目标相同版本的系统里编译或者用 Docker 多阶段构建# 在 CentOS 7 兼容的环境里编译 FROM centos:7 AS builder RUN yum install -y epel-release yum install -y mold # ... 编译步骤 ...这两个坑的共性是mold 发展很快版本之间差异大生产环境用最新稳定版但别用刚发布的版本。我现在固定用 mold 2.0.0不追新。四、实战在 CI 中自动化使用自定义链接器CI 流水线里的链接时间是实打实的成本。部署 mold 到 CI 只需要几行# .github/workflows/ci.yml — CI 中使用 mold 加速链接 name: CI on: [push, pull_request] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 - name: 安装 mold 链接器 run: | # mold 安装极快几秒完成 sudo apt-get update sudo apt-get install -y mold - name: 安装 Rust uses: dtolnay/rust-toolchainstable - name: 编译 测试 run: | # 通过环境变量指定链接器优先级高于 config.toml RUSTFLAGS-C link-arg-fuse-ldmold cargo test --release RUSTFLAGS-C link-arg-fuse-ldmold cargo build --release - name: 验证链接方式 run: | # 确认二进制确实使用了 mold 链接 readelf -p .comment target/release/my-app | grep mold这套配置的 ROI 简单计算如果每个 CI run 中有 5 个不同的cargo build/cargo test命令使用 mold 后中型项目从 90s → 25s每次 CI 节省 65 秒每天 20 次 CI节省约 22 分钟的等待时间对于付费 CI 按分钟计费的团队一个月下来能省不少钱。CI 里安装 mold 的三种方式对比mold不是所有 CI 环境的默认工具链组件需要自己安装。我在 GitHub Actions 里试过三种安装方式耗时差异很大安装方式耗时可靠性适用场景sudo apt-get install mold10-30sUbuntu 22.04 默认源没有需加 PPA中Ubuntu 22.04从源码编译 mold120-180s高但太慢需要最新功能或特定平台下载官方预编译二进制3-5s高CI 推荐方式我现在的做法是直接下载官方预编译二进制整个安装步骤 5 秒内完成- name: 安装 mold 链接器预编译二进制5 秒完成 run: | # 直接下载官方预编译二进制不需要 apt-get 或编译 curl -L https://github.com/rui314/mold/releases/download/v2.0.0/mold-2.0.0-x86_64-linux.tar.gz \ | tar xz -C /tmp/ echo /tmp/mold-2.0.0-x86_64-linux/bin $GITHUB_PATHmold 不会加快cargo test里的编译速度只会加快链接速度。如果你的项目是测试密集型的每次 CI 跑几千个单元测试链接时间优化对总体 CI 时间的贡献可能不到 10%。mold 的 ROI 最高的场景是那些cargo build --release产物很大、且频繁做全量编译的项目。另一个实战技巧把 mold 二进制本身也缓存起来。GitHub Actions 的actions/cache可以缓存/tmp/mold-2.0.0-x86_64-linux目录这样第二次 CI run 连下载都不需要- name: 缓存 mold 二进制 uses: actions/cachev4 with: path: /tmp/mold-2.0.0-x86_64-linux key: mold-2.0.0五、总结换个链接器是提升 Rust 编译体验最高性价比的优化——不需要改代码不需要重构项目一行配置就能见效。核心建议场景推荐链接器理由日常开发mold速度第一体感提升巨大CI/CD 流水线mold省钱省时间macOS 项目lldmold 在 macOS 上支持不完善跨平台交叉编译lldLLVM 生态兼容性最好需要最高稳定性lld出货量大久经考验一句话总结如果今天你只能做一件事来加速 Rust 编译把默认链接器换成 mold 是回报名最明确的选择。

相关新闻

高性能2.4G无线收发芯片推荐:芯岭技术XL24系列2.4G收发芯片

高性能2.4G无线收发芯片推荐:芯岭技术XL24系列2.4G收发芯片

深圳市芯岭技术有限公司推出的XL24系列芯片,以差异化的产品定位,精准覆盖了从简单遥控到复杂外设的多样化需求。XL2400T、XL2417D、XL2417U三款定位清晰的芯片,提供了从基础收发到高性能SoC再到带USB的SOC芯片解决方案。它们都有着优秀的射频…

2026/7/18 23:24:19 阅读更多 →
AI Agent时代的流程自动化:RPA、Workflow与LLM协同架构实践

AI Agent时代的流程自动化:RPA、Workflow与LLM协同架构实践

前言 过去十年,企业流程自动化主要依赖RPA(Robotic Process Automation,机器人流程自动化)。 从财务报销、订单处理到数据录入,大量重复性工作被RPA取代,帮助企业显著降低人工成本。 然而随着业务复杂度不断…

2026/7/18 23:23:19 阅读更多 →
操作系统——基础认识——内存管理

操作系统——基础认识——内存管理

操作系统——基础认识每天一个计算机知识:操作系统基础 一、定义站在用户视角,操作系统是一个为用户提供便捷、高效使用计算机环境的软件集合。但它的真正使命是:高效地管理硬件资源,并为上层软件提供统一且便捷的服务接口。 它的…

2026/7/18 23:23:19 阅读更多 →

最新新闻

Zynq-7000 MIO架构解析与配置实践

Zynq-7000 MIO架构解析与配置实践

1. Zynq-7000的MIO架构解析 在Zynq-7000系列SoC中,MIO(Multiplexed I/O)是连接处理系统(PS)和可编程逻辑(PL)的关键接口。与纯粹的FPGA不同,Zynq的MIO引脚具有高度灵活的可配置性&am…

2026/7/19 3:39:07 阅读更多 →
机器学习模型上线后如何保障系统韧性与业务连续性

机器学习模型上线后如何保障系统韧性与业务连续性

1. 为什么“模型上线”不是终点,而是系统性风险的起点? 你有没有经历过这样的场景:模型在Jupyter Notebook里跑得飞起,AUC 0.92,F1 0.87,业务方拍板签字,庆功会都快安排上了——结果上线第三天&…

2026/7/19 3:39:07 阅读更多 →
主流编程语言深度对比与选型指南 —— Java · C++ · Python · Go · JavaScript

主流编程语言深度对比与选型指南 —— Java · C++ · Python · Go · JavaScript

主流编程语言深度对比与选型指南 —— Java C Python Go JavaScript 写作目的:为编程初学者提供一份"看完就能做选型决策"的语言对比文档。本文不仅列出特点,更解释每门语言为什么这样设计、适合什么人学、学完能找什么工作。 阅读时长&am…

2026/7/19 3:39:07 阅读更多 →
告别命令行烦恼:Applite让你的macOS软件管理变得简单直观的终极指南

告别命令行烦恼:Applite让你的macOS软件管理变得简单直观的终极指南

告别命令行烦恼:Applite让你的macOS软件管理变得简单直观的终极指南 【免费下载链接】Applite User-friendly GUI macOS application for Homebrew Casks 项目地址: https://gitcode.com/gh_mirrors/ap/Applite 还在为复杂的Homebrew命令而头疼吗&#xff1f…

2026/7/19 3:39:07 阅读更多 →
串口通信与蓝牙模块开发实战指南

串口通信与蓝牙模块开发实战指南

1. 串口通信与蓝牙模块的基础认知第一次接触串口通信是在大学电子设计竞赛上,当时需要用单片机采集传感器数据并通过电脑显示。记得那会儿连最基本的波特率设置都搞不明白,数据总是乱码。后来才发现,原来串口通信就像两个人在用摩斯密码交流—…

2026/7/19 3:39:07 阅读更多 →
OMAP4460 PRM模块实战:电源时钟管理寄存器配置与调试指南

OMAP4460 PRM模块实战:电源时钟管理寄存器配置与调试指南

1. 项目概述:深入OMAP4460的电源与时钟管理核心在嵌入式系统,尤其是智能手机、平板电脑这类对功耗极其敏感的移动设备开发中,我们这些底层驱动工程师或系统架构师每天打交道最多的,除了应用逻辑,就是芯片的电源与时钟管…

2026/7/19 3:38:07 阅读更多 →

日新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:00:40 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:00:40 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:00:40 阅读更多 →

月新闻