Linker 如何让链接器使用Cargo生成映射文件
我正在为使用锌的STM32F407处理器编写一个Rust程序。我想能够产生一个链接器映射文件。我发现,我可以在main.rs中添加以下内容,从而获得所需的结果: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
#![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
作为链接器。默认值可能在某个版本后更改。或者仅仅因为我在使用#![无标准]
。