{arm,thumb}*-none-eabi(hf)?
层级:2
- arm(eb)?v7r-none-eabi(hf)?
- armv7a-none-eabi
- thumbv6m-none-eabi
- thumbv7m-none-eabi
- thumbv7em-none-eabi(hf)?
- thumbv8m.base-none-eabi
- thumbv8m.main-none-eabi(hf)?
层级:3
- {arm,thumb}v4t-none-eabi
- {arm,thumb}v5te-none-eabi
- armv7a-none-eabihf
- armv8r-none-eabihf
32 位 ARM CPU 的裸机目标。
如果目标具有 *hf
变体,则该变体使用硬件浮点 ABI 并根据该处理器系列中可用的 FPU 启用一些最小浮点功能集。
要求
这些目标是交叉编译的,并使用静态链接。
默认情况下,将使用 Rust 附带的 lld
链接器;但是,您可能希望使用 GNU 链接器。这可以在 Windows/Mac/Linux 上从 Arm 开发者网站 获得,或者可能从您的操作系统包管理器获得。要使用它,请将以下内容添加到您的 .cargo/config.toml
中
[target.<your-target>]
linker = "arm-none-eabi-ld"
GNU 链接器也可以通过将 arm-none-eabi-gcc
指定为链接器来使用。这在使用 GCC 的链接时优化时是必需的。
这些目标不提供链接器脚本,因此您需要根据您使用的特定设备自行提供。传递 -Clink-arg=-Tyour_script.ld
作为 rustc 参数,以使链接器在链接期间使用 your_script.ld
。
名为 thumb*
而不是 arm*
的目标默认情况下生成 Thumb 模式代码。M 剖析处理器 (thumbv*m*-*
目标) 仅支持 Thumb 模式代码。对于 arm*
目标,可以使用 -C target-feature=+thumb-mode
启用 Thumb 模式代码生成。使用不稳定的 #![feature(arm_target_feature)]
,属性 #[target_feature(enable = "thumb-mode")]
可以应用于单个 unsafe
函数,以使这些函数被编译为 Thumb 模式代码。
构建 Rust 程序
对于此系列中的层级 3 目标,rust 不提供预编译的工件。
只需使用 build-std
nightly cargo 功能来构建 core
库。您可以将其作为命令行参数传递给 cargo,或者您的 .cargo/config.toml
文件可能包含以下行
[unstable]
build-std = ["core"]
大多数 core
应该按预期工作,并注意以下几点
- 如果目标不是
*hf
,则浮点运算将在软件中模拟。 - 整数除法也将在某些目标上在软件中模拟,具体取决于 CPU。
- ARMv7 之前的架构没有原子指令。
alloc
也受支持,只要您提供自己的全局分配器。
Rust 程序输出为 ELF 文件。
测试
这是一个交叉编译的目标,您需要在测试期间对其进行模拟。
您需要的确切模拟器取决于您要运行代码的特定设备。
交叉编译工具链和 C 代码
该目标支持使用 arm-none-eabi
目标三元组和合适的 -march
或 -mcpu
标志编译的 C 代码。
可以使用 gcc
或 clang
,但请注意,gcc
默认情况下对 arm-none*
目标使用 -fshort-enums
,而 clang
则不使用。rustc
匹配 gcc
行为,即 Rust 中 #[repr(C)] enum
的大小可以小到 1 字节,而不是 4 字节,因为它们在 arm-linux
目标上。