如何使用Cargo使连接器生成映射文件

7

我正在使用zinc为STM32F407处理器编写Rust程序。我希望能够生成链接映射文件。我发现,如果在main.rs中添加以下内容,就可以得到所需的结果:

#![feature(link_args)]
#[link_args = "-Wl,-Map=blink_stm32f4.map"]
extern {}

然而,关于link_args的文档建议不要使用这种方法。
还有哪些方法可以让链接器生成映射文件呢?
2个回答

7

link-args可以通过rustc -C link-args="-Wl,-Map=blink_stm32f4.map" test.rs传递给rustc

还有build部分的cargorustflags选项。请参见cargo配置。它的用法如下:

$ cargo new --bin testbin
$ cd testbin
$ cat .cargo/config 
[build]
rustflags = ["-Clink-args=-Wl,-Map=/tmp/blink_f7.map"]
$ cargo build

另外,在cargo的配置中有一个链接器选项。我没有尝试通过此选项传递gcc加上flags,只是gcc,但你可以写一个像下面这样的gcc包装脚本:

$ cat my-linker.sh
#!/bin/sh

arm-...-gcc -Wl,-Map=blink_stm32f4.map $@

1
我尝试在我的Cargo.toml文件中添加以下内容:[build] rustflags = [ "-Wl,-Map=blink_f7.map" ]但是我收到了以下警告:warning: unused manifest key: build.rustflags我正在使用nightly-2016-05-24进行构建。似乎我通过谷歌搜索找到的许多提示仅适用于较旧版本的rust/cargo。 - Dave Hylands
1
我已经成功运行了my-linker.sh脚本 - 谢谢。这应该适用于Linux和OSX。我正在构建比单个文件更大的东西,所以我不确定直接调用rustc会有什么帮助。我需要在链接时包含zinc及其依赖项。虽然只完成了三分之一,但仍然是进展。 - Dave Hylands
1
@DaveHylands 我更新了我的回答,并描述了如何使用 cargo 配置。顺便说一下,链接器也可以在 .cargo/config 中设置,并且您可以为不同的架构设置不同的值。 - fghj
1
太好了。我已经成功运行了您的示例。使用rustflags = ["-C", "linkargs=...]也有效。使用rustflags = [“-C linkargs=…](即-C和linkargs之间有空格)则无效。 我认为我一直混淆Cargo.toml和.cargo/config,这就是为什么我的某些尝试没有成功的原因。 - Dave Hylands

0

我试图在 .cargo/config 中添加类似以下的内容:

[build]
rustflags = ["-Clink-args=-Wl,-Map=/tmp/app.map"]

但是我遇到了错误:

rust-lld:错误:未知参数 '-Wl,-Map=/tmp/app.map'

根据这篇博客的说明,在更改如下后就能正常工作:

[build]
rustflags = ["-Clink-args=-Map=/tmp/app.map"]

1
类似 -Wl,-Map 的参数是针对 GCC 或兼容的 C 编译器的,有时也用作链接器。每个 -Wl 参数后面的参数都会被 C 编译器传递给链接器。如果 rustc 直接使用链接器(这是大多数目标平台的默认设置),则不需要 -Wl,因为您不需要与 C 编译器中介进行通信。 - Mastax
感谢Mastax提供的信息。我知道-Wl,option是一个gcc命令行选项,用于将选项传递给链接器。我不确定在什么情况下rustc会选择C编译器或rust-lld作为链接器。也许默认值在某个版本之后更改了。或者只是因为我正在使用#![no_std] - fengqi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接