Linker 如何让链接器使用Cargo生成映射文件

Linker 如何让链接器使用Cargo生成映射文件,linker,rust,rust-cargo,Linker,Rust,Rust Cargo,我正在为使用锌的STM32F407处理器编写一个Rust程序。我想能够产生一个链接器映射文件。我发现,我可以在main.rs中添加以下内容,从而获得所需的结果: #![feature(link_args)] #[link_args = "-Wl,-Map=blink_stm32f4.map"] extern {} 但是,他建议不要使用这种方法 还有什么其他方法可以让链接器生成映射文件?link args可以通过rustc-C link args=“-Wl,-map=blink\u stm32f

我正在为使用锌的STM32F407处理器编写一个Rust程序。我想能够产生一个链接器映射文件。我发现,我可以在main.rs中添加以下内容,从而获得所需的结果:

#![feature(link_args)]
#[link_args = "-Wl,-Map=blink_stm32f4.map"]
extern {}
但是,他建议不要使用这种方法


还有什么其他方法可以让链接器生成映射文件?

link args
可以通过
rustc-C link args=“-Wl,-map=blink\u stm32f4.map”test.rs
传递到
rustc

build
部分中有
cargo
rustflags
选项。看见它的工作原理如下:

$ cargo new --bin testbin
$ cd testbin
$ cat .cargo/config 
[build]
rustflags = ["-Clink-args=-Wl,-Map=/tmp/blink_f7.map"]
$ cargo build
cargo
config中还有
linker
选项。我不想通过 此选项
gcc
加上
flags
,仅
gcc
,但您可以编写
gcc
包装脚本,如:

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

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

我试图在
.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"]

我试图将:[build]rustflags=[“-Wl,-Map=blink\u f7.Map”]添加到我的Cargo.toml文件中,并得到以下警告:未使用的清单键:build.rustflags我正在使用nightly-2016-05-24进行构建。我在谷歌搜索中找到的很多提示似乎只适用于旧版本的rust/cargo。我使用了my-linker.sh脚本,谢谢。这应该在linux和OSX下工作。我正在构建一个比单个文件大得多的文件,所以我不确定直接调用rustc会有什么帮助。我需要在链接时包括锌及其依赖项。但是第1页(共3页)仍在进行中。@DaveHylands我更新了我的答案,说明了如何使用
cargo
config,顺便说一句,链接器也可以在
.cargo/config
中设置,并且可以为不同的架构将其设置为不同的值。Sweet。我有你的榜样。使用rustflags=[“-C”,“linkargs=…]也有效。使用rustflags=[“-C linkargs=…](即-C和linkargs之间的空格)则无效。我想我一直混淆了Cargo.toml和.Cargo/config,这就是为什么我的一些尝试没有成功的原因。像
-Wl,-Map
这样的参数用于GCC或兼容的C编译器,它们有时被用作链接器。每个
-Wl
参数之后的参数由C编译器传递给链接器。如果
rustc
直接使用链接器,这是大多数目标的默认设置,那么您不需要
-Wl
,因为您没有与C编译器中介进行对话。感谢Mastax提供的信息。我知道
-Wl,option
是一个gcc命令行选项,用于将选项传递给链接器。我不确定在哪种情况下,
rustc
会选择C编译器还是
rustlld
作为链接器。默认值可能在某个版本后更改。或者仅仅因为我在使用
#![无标准]