armv7-unknown-linux-uclibceabi

层级:3

此目标支持 ARMv7 软浮点 CPU 并使用 uclibc-ng 标准库。这是许多消费级路由器(例如,Netgear R7000、Asus RT-AC68U)上的常见配置。

目标维护者

要求

此目标是交叉编译的,需要交叉工具链。

此目标支持主机工具和 std。

构建目标

您需要下载或构建一个针对 ARMv7 软浮点并使用 uclibc-ng 标准库的“C”交叉工具链。如果您的目标硬件是路由器或嵌入式设备之类的设备,请记住,此类 CPU 的制造商提供的 SDK 可能已过时,并且可能不适合引导 rust。

这里 是一个使用 buildroot 构建的示例工具链。它使用现代工具链组件,较旧但通用的内核头文件 (2.6.36.4),并用于一个名为 Tomatoware 的项目。此工具链已修补,因此其 sysroot 位于 /mmc(例如,/mmc/bin、/mmc/lib、/mmc/include)。这在根文件系统为只读但您可以附加加载了用户应用程序的外部存储的情况下很有用。Tomatoware 是一个示例,它甚至允许您在目标设备上本地运行各种编译器和开发工具。

利用 Tomatoware 工具链,此目标可以为交叉编译和本地编译(主机工具)构建,使用项目

rust-bootstrap-armv7-unknown-linux-uclibceabi.

以下是使用您自己的工具链时的示例配置。

[build]
build-stage = 2
target = ["armv7-unknown-linux-uclibceabi"]

[target.armv7-unknown-linux-uclibceabi]
cc = "/path/to/arm-unknown-linux-uclibcgnueabi-gcc"
cxx = "/path/to/arm-unknown-linux-uclibcgnueabi-g++"
ar = "path/to/arm-unknown-linux-uclibcgnueabi-ar"
ranlib = "path/to/arm-unknown-linux-uclibcgnueabi-ranlib"
linker = "/path/to/arm-unknown-linux-uclibcgnueabi-gcc"

构建 Rust 程序

以下假设您使用的是 Tomatoware 工具链和环境。如果您使用的是您自己的工具链,请进行调整。

本地编译

由于此目标支持主机工具,因此您可以直接在目标设备上本地构建 rust 应用程序。这很方便,因为它消除了交叉编译的复杂性,您可以立即测试和部署您的二进制文件。一个缺点是在您的 ARMv7 CPU 上编译可能比在您的 x86 机器上交叉编译慢得多。

要设置本地编译

  • 使用 这里 找到的最新 nightly 版本将 Tomatoware 下载到您的设备。
  • 提取 tar zxvf arm-soft-mmc.tgz -C /mmc
  • /mmc/bin:/mmc:sbin/ 添加到您的 PATH,或 source /mmc/etc/profile
  • apt update && apt install rust

如果您使用上面的项目自行引导 rust,它将创建一个 .deb 文件,然后您可以使用以下命令安装它

dpkg -i rust_1.xx.x-x_arm.deb

完成这些步骤后,您可以在本地环境中正常使用 rust。

交叉编译

要交叉编译,您需要

  • 使用 rust-bootstrap-armv7-unknown-linux-uclibceabi 或您自己构建的工具链构建 rust 交叉工具链。

  • 将您构建的工具链与

    rustup toolchain link stage2 \
    ${HOME}/rust-bootstrap-armv7-unknown-linux-uclibceabi/src/rust/rust/build/x86_64-unknown-linux-gnu/stage2
    
  • 使用以下命令构建

    CC_armv7_unknown_linux_uclibceabi=/opt/tomatoware/arm-soft-mmc/bin/arm-linux-gcc \
    CXX_armv7_unknown_linux_uclibceabi=/opt/tomatoware/arm-soft-mmc/bin/arm-linux-g++ \
    AR_armv7_unknown_linux_uclibceabi=/opt/tomatoware/arm-soft-mmc/bin/arm-linux-ar \
    CFLAGS_armv7_unknown_linux_uclibceabi="-march=armv7-a -mtune=cortex-a9" \
    CXXFLAGS_armv7_unknown_linux_uclibceabi="-march=armv7-a -mtune=cortex-a9" \
    CARGO_TARGET_ARMV7_UNKNOWN_LINUX_UCLIBCEABI_LINKER=/opt/tomatoware/arm-soft-mmc/bin/arm-linux-gcc \
    CARGO_TARGET_ARMV7_UNKNOWN_LINUX_UCLIBCEABI_RUSTFLAGS='-Clink-arg=-s -Clink-arg=-Wl,--dynamic-linker=/mmc/lib/ld-uClibc.so.1 -Clink-arg=-Wl,-rpath,/mmc/lib' \
    cargo +stage2 \
    build \
    --target armv7-unknown-linux-uclibceabi \
    --release
    
  • 将二进制文件复制到您的目标设备并运行。

我们指定 CCCXXARCFLAGSCXXFLAGS 环境变量,因为有时项目或子项目需要使用您的“C”交叉工具链。由于 Tomatoware 具有修改后的 sysroot,我们还通过 RUSTFLAGS 传递动态链接器和 rpath 的位置。

使用 QEMU 测试

要在您的构建系统上测试交叉编译的二进制文件,请按照“交叉编译”的说明进行操作,安装 qemu-arm-static,并使用以下命令运行。

CC_armv7_unknown_linux_uclibceabi=/opt/tomatoware/arm-soft-mmc/bin/arm-linux-gcc \
CXX_armv7_unknown_linux_uclibceabi=/opt/tomatoware/arm-soft-mmc/bin/arm-linux-g++ \
AR_armv7_unknown_linux_uclibceabi=/opt/tomatoware/arm-soft-mmc/bin/arm-linux-ar \
CFLAGS_armv7_unknown_linux_uclibceabi="-march=armv7-a -mtune=cortex-a9" \
CXXFLAGS_armv7_unknown_linux_uclibceabi="-march=armv7-a -mtune=cortex-a9" \
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_UCLIBCEABI_LINKER=/opt/tomatoware/arm-soft-mmc/bin/arm-linux-gcc \
CARGO_TARGET_ARMV7_UNKNOWN_LINUX_UCLIBCEABI_RUNNER="qemu-arm-static -L /opt/tomatoware/arm-soft-mmc/arm-tomatoware-linux-uclibcgnueabi/sysroot/" \
cargo +stage2 \
run \
--target armv7-unknown-linux-uclibceabi \
--release

在 chroot 中运行

也可以在 chroot 环境中构建。这是一种无需访问目标硬件即可工作的便捷方法。

要构建 chroot

  • sudo debootstrap --arch armel bullseye $HOME/debian
  • sudo chroot $HOME/debian/ /bin/bash
  • mount proc /proc -t proc
  • mount -t sysfs /sys sys/
  • export PATH=/mmc/bin:/mmc/sbin:$PATH

从这里您可以设置您的环境(例如,添加用户,安装 wget)。

  • 使用 这里 找到的最新 nightly 版本将 Tomatoware 下载到 chroot 环境。
  • 提取 tar zxvf arm-soft-mmc.tgz -C /mmc
  • /mmc/bin:/mmc:sbin/ 添加到您的 PATH,或 source /mmc/etc/profile
  • sudo /mmc/bin/apt update && sudo /mmc/bin/apt install rust

完成这些步骤后,您可以在 chroot 环境中正常使用 rust。

请记住,使用 sudo 时,root 用户的 PATH 可能与您的用户 PATH 不同。