我正在使用zinc为STM32F407处理器编写Rust程序。我希望能够生成链接映射文件。我发现,如果在main.rs中添加以下内容,就可以得到所需的结果:
#![feature(link_args)]
#[link_args = "-Wl,-Map=blink_stm32f4.map"]
extern {}
然而,关于
link_args
的文档建议不要使用这种方法。还有哪些方法可以让链接器生成映射文件呢?
我正在使用zinc为STM32F407处理器编写Rust程序。我希望能够生成链接映射文件。我发现,如果在main.rs中添加以下内容,就可以得到所需的结果:
#![feature(link_args)]
#[link_args = "-Wl,-Map=blink_stm32f4.map"]
extern {}
link_args
的文档建议不要使用这种方法。link-args
可以通过rustc -C link-args="-Wl,-Map=blink_stm32f4.map" test.rs
传递给rustc
。
还有build
部分的cargo
rustflags
选项。请参见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 $@
我试图在 .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"]
-Wl,-Map
的参数是针对 GCC 或兼容的 C 编译器的,有时也用作链接器。每个 -Wl
参数后面的参数都会被 C 编译器传递给链接器。如果 rustc
直接使用链接器(这是大多数目标平台的默认设置),则不需要 -Wl
,因为您不需要与 C 编译器中介进行通信。 - Mastax-Wl,option
是一个gcc命令行选项,用于将选项传递给链接器。我不确定在什么情况下rustc
会选择C编译器或rust-lld
作为链接器。也许默认值在某个版本之后更改了。或者只是因为我正在使用#![no_std]
。 - fengqi
[build] rustflags = [ "-Wl,-Map=blink_f7.map" ]
但是我收到了以下警告:warning: unused manifest key: build.rustflags
我正在使用nightly-2016-05-24进行构建。似乎我通过谷歌搜索找到的许多提示仅适用于较旧版本的rust/cargo。 - Dave Hylandscargo
配置。顺便说一下,链接器也可以在.cargo/config
中设置,并且您可以为不同的架构设置不同的值。 - fghj