如何使用带有货物的模具链接器?

问题描述 投票:0回答:4

我目前使用 lld 作为 Rust 的链接器,但最近遇到了 Mold 项目,它比 lld 更快。我想尝试使用 Rust 编译,但我不确定如何将它作为我的链接器传递。在我的

.cargo/config
文件中,我有:

[target.x86_64-unknown-linux-gnu]
rustflags = [
    "-C", "link-arg=-fuse-ld=lld",
]

但我不能只是将

lld
更改为
mold
,或提供
mold
可执行文件的路径。有没有办法让 gcc 接受链接器的路径?

rust linker rust-cargo mold
4个回答
36
投票

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)

18
投票
不幸的是,

gcc 不接受任意路径作为

-fuse-ld
的参数。不要调整
.cargo/config
文件,而是尝试将
cargo build
运行为
path/to/mold -run cargo build
。通过这样做,货物会在霉菌的影响下运行,所有对
/usr/bin/ld
/usr/bin/ld.gold
/usr/bin/ld.lld
的调用都会被
mold
拦截并替换。


1
投票

首先,创建一个到 lld 的 Mold 符号链接,以欺骗 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


0
投票

如果有人需要一句俏话:我今天遇到了这个问题,在尝试了所有找到的答案和文章之后 - 在 x86 linux 上尝试

mold
-ed 构建的最简单方法是这个命令(假设你确实输入了
mold
在你的
PATH
):

RUSTFLAGS="-C linker=clang -C link-arg=-fuse-ld=mold" cargo build --release
© www.soinside.com 2019 - 2024. All rights reserved.