armv7-unknown-linux-uclibceabi
级别:3
此目标支持 Armv7-A 软浮点 CPU,并使用 uclibc-ng 标准库。这在许多消费级路由器(例如,网件 R7000、华硕 RT-AC68U)上是一种常见的配置。
目标维护者
要求
此目标是交叉编译的,需要一个交叉工具链。
此目标支持主机工具和 std。
构建目标
您需要下载或构建一个以 Armv7-A 软浮点为目标并使用 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-A 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
-
将二进制文件复制到您的目标设备并运行。
我们指定 CC
、CXX
、AR
、CFLAGS
和 CXXFLAGS
环境变量,因为有时项目或子项目需要使用您的 '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 不同。