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

How to get the linker to produce a map file using Cargo

我正在使用 zinc 编写针对 STM32F407 处理器的 Rust 程序。我希望能够生成链接器映射文件。我发现我可以在我的 main.rs 中放入以下内容,这给了我想要的结果:

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

但是,the documentation for link_args建议不要使用这种方法。

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

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

传递给 rustc

并且build部分有cargorustflags选项。参见 cargo config。它是这样工作的:

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

cargo 配置中还有 linker 选项。我不试图通过 此选项 gccflags,仅 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: error: unknown argument '-Wl,-Map=/tmp/app.map'

根据this blog,我将其更改为:

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