armv6k-nintendo-3ds

层级:3

Nintendo 3DS 平台,它拥有 ARMv6K 处理器,以及其关联的操作系统 (horizon)。

此目标的 Rust 支持与任天堂无关,并且不源自也不与任何官方任天堂 SDK 一起使用。

目标维护者

此目标由 @rust3ds 组织的成员维护

要求

此目标是交叉编译的。不支持动态链接。

#![no_std] 箱子可以使用 build-std 来构建 core 和可选的 alloc,以及 panic_abortpanic_unwind

std 部分支持,但大部分有效。一些 API 未实现,只会返回错误,例如 std::process。默认情况下提供了一个分配器。

为了支持某些 API,二进制文件必须使用针对目标的链接器链接到为目标编写的 libc。这些由 devkitARM 工具链提供。有关更多详细信息,请参阅 交叉编译工具链和 C 代码

此外,一些辅助箱子提供了 libc 函数的一些实现,这些函数由 std 使用,否则可能缺失。这些,或相关函数的替代实现,是使用 std 所必需的。

  • pthread-3dsstd::thread 提供 pthread API。
  • shim-3ds 满足一些其他缺失的 libc API(例如 getrandom)。

为该目标构建的二进制文件应与所有版本的 3DS(和 2DS)硬件和固件兼容,但测试有限,某些版本可能无法正常工作。

此目标以 ELF 格式生成二进制文件。

构建目标

您可以通过将目标添加到 config.toml 中的 target 列表中并提供 devkitARM 工具链的路径来构建支持该目标的 Rust。

[build]
build-stage = 1
target = ["armv6k-nintendo-3ds"]

[target.armv6k-nintendo-3ds]
cc = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-gcc"
cxx = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-g++"
ar = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-ar"
ranlib = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-ranlib"
linker = "/opt/devkitpro/devkitARM/bin/arm-none-eabi-gcc"

此外,要为该目标构建 compiler_builtins,请在构建 Rust 工具链之前导出这些标志

export CFLAGS_armv6k_nintendo_3ds="-mfloat-abi=hard -mtune=mpcore -mtp=soft -march=armv6k"

构建 Rust 程序

Rust 尚未为此目标提供预编译的工件。

构建二进制文件的推荐方法是使用 cargo-3ds 工具,该工具使用 build-std 并提供类似于通常的 cargo runcargo build 等的命令。cargo 3ds new 将自动设置一个新项目,其中包含构建简单二进制文件所需的依赖项。

您还可以构建启用了该目标的 Rust(请参阅上面的 构建目标)。

要求 中所述,使用 std 的程序必须链接到 devkitARM 工具链和提供 std 中使用的 libc API 的库。有一个通用实用程序箱用于处理操作系统提供的非标准 API:ctru-rs。将其添加到 Cargo.toml 以在您的程序中使用它

[dependencies]
ctru-rs = { git = "https://github.com/rust3ds/ctru-rs.git" }

依赖于 ctru-rs 可确保在链接时所有必要的符号都可用。

测试

为该目标构建的二进制文件可以在模拟器(最常见的是 Citra)中运行,或者使用 devkitARM 的 3dslink 等工具发送到设备。它们也可以简单地复制到 SD 卡中,然后插入设备。

构建 Rust 程序 中提到的 cargo-3ds 工具支持使用 cargo 3ds run 使用 3dslink。默认的 Rust 测试运行器不受支持,但可以使用 自定义测试框架cargo 3ds test 一起在设备上运行单元测试。

library/std 的 Rust 测试套件尚不支持。

交叉编译工具链和 C 代码

可以使用 devkitARM 工具链 为该目标构建 C 代码。此工具链提供 arm-none-eabi-gcc 作为链接器,用于链接 Rust 程序。

该工具链还提供了一个 libc 实现,std 的许多 API 都需要它,以及一个辅助库 libctru,它被 要求 中列出的几个辅助箱子使用。但是,此工具链不包含 std 预期的所有 API,其余 API 由 pthread-3dslinker-fix-3ds 实现。