mipsisa*r6*-unknown-linux-gnu*
层级:3
MIPS Release 6,或简称为 MIPS R6,是 MIPS 指令集架构 (ISA) 的最新版本。
MIPS R6 处于实验阶段,因为还没有真正的硬件。但是,Qemu 模拟器可用,我们维护了两个 Linux 发行版用于开发和评估。本文档介绍了 mipsisa*r6*-unknown-linux-gnu*
下 MIPS R6 目标的 Rust 支持。
目标名称遵循以下格式:<machine>-<vendor>-<os><abi_suffix>
,其中 <machine>
指定 CPU 系列/型号,<vendor>
指定供应商,<os>
指定操作系统名称。<abi_suffix>
表示基本 ABI (32/n32/64/o64)。
ABI 后缀 | 描述 |
---|---|
abi64 | 使用 64 位 (64) ABI |
abin32 | 使用 n32 ABI |
N/A | 使用(假设的)32 位 (32) ABI |
目标维护者
要求
C/C++ 工具链
需要一个适用于 MIPS R6 目标的 GNU 工具链。 AOSC OS 提供了可用的原生和交叉编译构建环境。您也可以提供自己的工具链,其中包含最新版本的 GCC 和 Binutils。
目标库
执行动态链接需要最少的一组库
- GNU glibc
- OpenSSL
- Zlib
- Linux API 头文件
这组库应该被安装以构成最小的目标系统根目录。
对于 AOSC OS,您可以使用以下命令安装这样的系统根目录
cd /tmp
# linux+api, glibc, and file system structure are included in the toolchain.
sudo apt install gcc+cross-mips64r6el binutils+cross-mips64r6el
# Download and extract required libraries.
wget https://repo.aosc.io/debs/pool/stable/main/z/zlib_1.2.13-0_mips64r6el.deb -O zlib.deb
wget https://repo.aosc.io/debs/pool/stable/main/o/openssl_1.1.1q-1_mips64r6el.deb -O openssl.deb
# Extract them to your desired location.
for i in zlib openssl ; do
sudo dpkg-deb -vx $i.deb /var/ab/cross-root/mips64r6el
done
# Workaround a possible ld bug when using -Wl,-Bdynamic.
sudo sed -i 's|/usr|=/usr|g' /var/ab/cross-root/mips64r6el/usr/lib/libc.so
对于其他发行版,您可以手动构建它们。
构建
以下步骤概述了使用 64 位 (64) ABI (mipsisa64r6el-unknown-linux-gnuabi64
) 构建 MIPS64 R6 目标的过程。
先决条件:禁用调试信息
LLVM 中的一个错误会导致 rustc 在启用调试或调试信息生成时崩溃。您需要编辑 config.toml
来禁用它
[rust]
debug = false
debug-info-level = 0
先决条件:启用 rustix 的 libc 后端
rustix
箱子可能会尝试将自身链接到 MIPS R2 汇编,导致链接错误。为了避免这种情况,您可以通过设置相关的 RUSTFLAGS
来强制 rustix
使用其回退 libc
后端
export RUSTFLAGS="--cfg rustix_use_libc"
这将在构建过程中触发警告,因为 -D warnings
默认情况下是启用的。通过编辑 config.toml
来添加以下内容来禁用 -D warnings
[rust]
deny-warnings = false
先决条件:提供 OpenSSL
作为 Tier 3 目标,openssl_sys
缺少针对此目标的供应商提供的 OpenSSL 库。您需要提供一个预构建的 OpenSSL 库来链接 cargo
。由于我们有一个预配置的系统根目录,我们可以直接指向它
export MIPSISA64R6EL_UNKNOWN_LINUX_GNUABI64_OPENSSL_NO_VENDOR=y
export MIPSISA64R6EL_UNKNOWN_LINUX_GNUABI64_OPENSSL_DIR="/var/ab/cross-root/mips64r6el/usr"
在 Debian 上,您可能需要分别提供库路径和包含路径
export MIPSISA64R6EL_UNKNOWN_LINUX_GNUABI64_OPENSSL_NO_VENDOR=y
export MIPSISA64R6EL_UNKNOWN_LINUX_GNUABI64_OPENSSL_LIB_DIR="/usr/lib/mipsisa64r6el-linux-gnuabi64/"
export MIPSISA64R6EL_UNKNOWN_LINUX_GNUABI64_OPENSSL_INCLUDE_DIR="/usr/include"
启动 x.py
[build]
target = ["mipsisa64r6el-unknown-linux-gnuabi64"]
确保 mipsisa64r6el-unknown-linux-gnuabi64-gcc
可从您的可执行文件搜索路径 ($PATH
) 中获得。
或者,您可以在 config.toml
中指定所有必要工具链可执行文件的目录
[target.mipsisa64r6el-unknown-linux-gnuabi64]
# Adjust the paths below to point to your toolchain installation prefix.
cc = "/toolchain_prefix/bin/mipsisa64r6el-unknown-linux-gnuabi64-gcc"
cxx = "/toolchain_prefix/bin/mipsisa64r6el-unknown-linux-gnuabi64-g++"
ar = "/toolchain_prefix/bin/mipsisa64r6el-unknown-linux-gnuabi64-gcc-ar"
ranlib = "/toolchain_prefix/bin/mipsisa64r6el-unknown-linux-gnuabi64-ranlib"
linker = "/toolchain_prefix/bin/mipsisa64r6el-unknown-linux-gnuabi64-gcc"
或者,您可以使用环境变量指定您的交叉编译器工具链
export CROSS_COMPILE="/opt/abcross/mips64r6el/bin/mipsisa64r6el-aosc-linux-gnuabi64-"
最后,启动构建脚本
./x.py build
提示
- 避免将
cargo-native-static
设置为false
,因为这会导致在构建 clippy 时出现冗余工件错误duplicate artifacts found when compiling a tool, this typically means that something was recompiled because a transitive dependency has different features activated than in a previous build: the following dependencies have different features: syn 2.0.8 (registry+https://github.com/rust-lang/crates.io-index) `clippy-driver` additionally enabled features {"full"} at ... `cargo` additionally enabled features {} at ... to fix this you will probably want to edit the local src/tools/rustc-workspace-hack/Cargo.toml crate, as that will update the dependency graph to ensure that these crates all share the same feature set thread 'main' panicked at 'tools should not compile multiple copies of the same crate', tool.rs:250:13 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
构建 Rust 程序
要为 MIPS R6 目标构建 Rust 程序,例如 mipsisa64r6el-unknown-linux-gnuabi64
目标
cargo build --target mipsisa64r6el-unknown-linux-gnuabi64
测试
要在您的构建系统上测试交叉编译的二进制文件,请安装支持 MIPS R6 架构的 Qemu 用户模拟器 (qemu-user-mipsel
或 qemu-user-mips64el
)。目标架构的 GCC 运行时库 (libgcc_s
) 应该存在于目标系统根目录中,以便运行该程序。
env \
CARGO_TARGET_MIPSISA64R6EL_UNKNOWN_LINUX_GNUABI64_LINKER="/opt/abcross/mips64r6el/bin/mipsisa64r6el-aosc-linux-gnuabi64-gcc" \
CARGO_TARGET_MIPSISA64R6EL_UNKNOWN_LINUX_GNUABI64_RUNNER="qemu-mips64el-static -L /var/ab/cross-root/mips64r6el" \
cargo run --release \
--target mipsisa64r6el-unknown-linux-gnuabi64
为 MIPS R6 构建 Rust 程序的提示
- 在我们最终确定修复程序之前,请确保始终应用上述针对
rustix
箱子和 LLVM 的解决方法。这可以通过设置相关的环境变量,并在构建之前编辑Cargo.toml
来实现。