模具连接器如何与货物一起使用?
How to use the mold linker with cargo?
我目前使用 lld 作为 Rust 的链接器,但最近遇到了 mold 项目,它比 lld 更快。我想为 Rust 编译尝试它,但我不确定如何将它作为我的链接器传递。在我的 .cargo/config
文件中我有:
[target.x86_64-unknown-linux-gnu]
rustflags = [
"-C", "link-arg=-fuse-ld=lld",
]
但我不能只将 lld
更改为 mold
,或者提供 mold
可执行文件的路径。有没有办法让 gcc 接受链接器的路径?
不幸的是,gcc 不接受任意路径作为 -fuse-ld
的参数。不要调整 .cargo/config
文件,而是尝试 运行 cargo build
作为 path/to/mold -run cargo build
。通过这样做,cargo 在 mold 的影响下运行,并且 /usr/bin/ld
、/usr/bin/ld.gold
和 /usr/bin/ld.lld
的所有调用都被拦截并替换为 mold
。
首先,创建一个 mold 到 lld 的符号链接,让 rust 相信它是 ld.lld。
sudo ln -s /usr/bin/ld.mold /usr/bin/ld.lld
然后将此添加到您的 ~/.cargo/config 文件中以指定 ld.lld(现在是模具)
[target.x86_64-unknown-linux-gnu]
rustflags = [
"-C", "link-arg=-fuse-ld=lld",
]
现在在没有 mold -run
的情况下构建并阅读评论 (readelf -p .comment target/debug/program-name
)
String dump of section '.comment':
[ 0] GCC: (GNU) 11.1.0
[ 13] mold 0.9.3 (compatible with GNU ld and GNU gold)
我不太确定如何将符号链接设置为 ld.lld,我想我目前没有那个文件,但是这非常 hacky 并且可以愚弄任何未来编译器使用 mold,同时相信它使用的是 lld(如果它设置为使用 lld)。我个人使用它,因为我不喜欢每次都输入 mold -run
。
Mold 现在可以与 Clang 一起使用,只需将其添加到 ~/.cargo/config.toml
[target.x86_64-unknown-linux-gnu]
linker = "/usr/bin/clang"
rustflags = ["-C", "link-arg=--ld-path=/usr/bin/mold"]
注意:如果从源安装,模具可能会安装在 /usr/local/bin/mold
,因此标志应该是 rustflags = ["-C", "link-arg=--ld-path=/usr/local/bin/mold"]
。 运行 $ which mold
仔细检查它的安装位置
您可以通过 运行 readelf -p .comment target/<type>/<binary_name>
检查它是否有效
$ readelf -p .comment target/debug/my_binary
String dump of section '.comment':
[ 0] GCC: (GNU) 11.1.0
[ 13] mold 1.0.0 (compatible with GNU ld and GNU gold)
我目前使用 lld 作为 Rust 的链接器,但最近遇到了 mold 项目,它比 lld 更快。我想为 Rust 编译尝试它,但我不确定如何将它作为我的链接器传递。在我的 .cargo/config
文件中我有:
[target.x86_64-unknown-linux-gnu]
rustflags = [
"-C", "link-arg=-fuse-ld=lld",
]
但我不能只将 lld
更改为 mold
,或者提供 mold
可执行文件的路径。有没有办法让 gcc 接受链接器的路径?
gcc 不接受任意路径作为 -fuse-ld
的参数。不要调整 .cargo/config
文件,而是尝试 运行 cargo build
作为 path/to/mold -run cargo build
。通过这样做,cargo 在 mold 的影响下运行,并且 /usr/bin/ld
、/usr/bin/ld.gold
和 /usr/bin/ld.lld
的所有调用都被拦截并替换为 mold
。
首先,创建一个 mold 到 lld 的符号链接,让 rust 相信它是 ld.lld。
sudo ln -s /usr/bin/ld.mold /usr/bin/ld.lld
然后将此添加到您的 ~/.cargo/config 文件中以指定 ld.lld(现在是模具)
[target.x86_64-unknown-linux-gnu]
rustflags = [
"-C", "link-arg=-fuse-ld=lld",
]
现在在没有 mold -run
的情况下构建并阅读评论 (readelf -p .comment target/debug/program-name
)
String dump of section '.comment':
[ 0] GCC: (GNU) 11.1.0
[ 13] mold 0.9.3 (compatible with GNU ld and GNU gold)
我不太确定如何将符号链接设置为 ld.lld,我想我目前没有那个文件,但是这非常 hacky 并且可以愚弄任何未来编译器使用 mold,同时相信它使用的是 lld(如果它设置为使用 lld)。我个人使用它,因为我不喜欢每次都输入 mold -run
。
Mold 现在可以与 Clang 一起使用,只需将其添加到 ~/.cargo/config.toml
[target.x86_64-unknown-linux-gnu]
linker = "/usr/bin/clang"
rustflags = ["-C", "link-arg=--ld-path=/usr/bin/mold"]
注意:如果从源安装,模具可能会安装在 /usr/local/bin/mold
,因此标志应该是 rustflags = ["-C", "link-arg=--ld-path=/usr/local/bin/mold"]
。 运行 $ which mold
仔细检查它的安装位置
您可以通过 运行 readelf -p .comment target/<type>/<binary_name>
$ readelf -p .comment target/debug/my_binary
String dump of section '.comment':
[ 0] GCC: (GNU) 11.1.0
[ 13] mold 1.0.0 (compatible with GNU ld and GNU gold)