x86_64-unknown-none

层级:2

ELF 格式的独立/裸机 x86-64 二进制文件:固件、内核等。

目标维护者

  • Harald Hoyer [email protected],https://github.com/haraldh
  • Mike Leany,https://github.com/mikeleany

要求

此目标是交叉编译的。不支持 std。没有默认分配器,但可以通过提供分配器来使用 alloc

默认情况下,为该目标生成的 Rust 代码不使用任何向量或浮点寄存器(例如 SSE、AVX)。这允许生成的代码在可能需要避免使用此类寄存器或对使用此类寄存器有特殊考虑的环境(例如内核)中运行(例如,保存和恢复它们以避免破坏使用相同寄存器的用户空间代码)。您可以通过 -C target-feature= 代码生成选项更改为 rustc 生成的代码以使用其他 CPU 功能,或者通过 Rust 代码中的 #[target_feature] 机制更改。

默认情况下,使用此目标生成的代码应该可以在任何 x86_64 硬件上运行;启用其他目标功能可能会提高此基线。

使用此目标生成的代码将默认使用 kernel 代码模型。您可以使用 -C code-model= 选项更改此选项到 rustc。

x86_64-unknown-none 上,extern "C" 使用 标准 System V 调用约定,没有红色区域。

此目标以 ELF 格式生成二进制文件。任何备用格式或二进制布局的特殊考虑都需要链接器选项或链接器脚本。

构建目标

您可以通过将目标添加到 config.toml 中的 target 列表中来构建支持该目标的 Rust。

[build]
build-stage = 1
target = ["x86_64-unknown-none"]

构建 Rust 程序

从 Rust 1.62 开始,预编译的工件通过 rustup 提供。

# install cross-compile toolchain
rustup target add x86_64-unknown-none
# target flag may be used with any cargo or rustc command
cargo build --target x86_64-unknown-none

测试

由于 x86_64-unknown-none 支持各种不同的环境并且不支持 std,因此此目标不支持运行 Rust 测试套件。

交叉编译工具链和 C 代码

如果您想将 C 代码与 Rust 一起编译(例如,对于具有 C 依赖项的 Rust 箱子),您将需要一个合适的 x86_64 工具链。

Rust 可能能够使用 x86_64-linux-gnu- 工具链以及适当的独立标志来构建此工具链(取决于该工具链的假设,见下文),或者您可能希望使用单独的 x86_64-unknown-none(或 x86_64-elf-)工具链。

在某些使用 ELF 二进制文件的 x86_64 主机上,您可能能够使用主机 C 工具链,如果它没有引入关于主机环境的假设,这些假设与独立环境的预期不匹配。否则,您可能需要一个独立/独立开发的单独工具链,就像从非 x86_64 平台交叉编译时一样。