【问题标题】:How to get the linker to produce a map file using Cargo如何让链接器使用 Cargo 生成地图文件
【发布时间】:2017-01-11 15:53:43
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: linker rust rust-cargo


    【解决方案1】:

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

    build 部分有cargo rustflags 的选项。见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 选项。我不试图通过 这个选项gcc 加上flags,只有gcc,但你可以写gcc 包装脚本,如:

    $ cat my-linker.sh
    #!/bin/sh
    
    arm-...-gcc -Wl,-Map=blink_stm32f4.map $@
    

    【讨论】:

    • 我尝试将:[build] rustflags = [ "-Wl,-Map=blink_f7.map" ] 添加到我的 Cargo.toml 文件中,我收到以下警告警告:未使用的清单密钥:构建.rustflags 我正在使用 nightly-2016-05-24 来构建。看来我通过谷歌搜索找到的许多提示仅适用于旧版本的 rust/cargo。
    • 我得到了 my-linker.sh 脚本 - 谢谢。这应该在 linux 和 OSX 下工作。我正在构建比单个文件大得多的东西,所以我不确定直接调用 rustc 会有什么帮助。我需要在链接时包含锌及其依赖项。不过,3 个中的 1 个仍在进行中。
    • @DaveHylands 我更新了我的答案,描述了如何使用cargo 配置,顺便说一下链接器你也可以在.cargo/config 中设置,你可以为不同的架构设置不同的值。跨度>
    • 甜蜜。我得到了你的榜样。使用 rustflags = ["-C", "linkargs=...] 也有效。使用 rustflags = ["-C linkargs=...] (即 -C 和 linkargs 之间的空格)无效。我想我一直在混淆 Cargo.toml 和 .cargo/config 这就是为什么我的一些尝试没有奏效。
    【解决方案2】:

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

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

    但我得到了错误:

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

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

    [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]
    猜你喜欢
    • 2011-01-29
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2022-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多