loongarch*-unknown-linux-*

Tier: 2

LoongArch is a new RISC ISA developed by Loongson Technology Corporation Limited.

The target name follow this format: <machine>-<vendor>-<os><fabi_suffix>, where <machine> specifies the CPU family/model, <vendor> specifies the vendor and <os> the operating system name. While the integer base ABI is implied by the machine field, the floating point base ABI type is encoded into the os field of the specifier using the string suffix <fabi-suffix>.

<fabi-suffix>Description
f64The base ABI use 64-bits FPRs for parameter passing. (lp64d)
f32The base ABI uses 32-bit FPRs for parameter passing. (lp64f)
sfThe base ABI uses no FPR for parameter passing. (lp64s)

ABI type(Base ABI/ABI extension)C librarykerneltarget tuple
lp64d/baseglibclinuxloongarch64-unknown-linux-gnu
lp64f/baseglibclinuxloongarch64-unknown-linux-gnuf32
lp64s/baseglibclinuxloongarch64-unknown-linux-gnusf
lp64d/basemusl libclinuxloongarch64-unknown-linux-musl
lp64f/basemusl libclinuxloongarch64-unknown-linux-muslf32
lp64s/basemusl libclinuxloongarch64-unknown-linux-muslsf

Target maintainers

Requirements

This target is cross-compiled. A GNU toolchain for LoongArch target is required. It can be downloaded from https://github.com/loongson/build-tools/releases, or built from the source code of GCC (12.1.0 or later) and Binutils (2.40 or later).

Building the target

The target can be built by enabling it for a rustc build.

[build]
target = ["loongarch64-unknown-linux-gnu"]

Make sure loongarch64-unknown-linux-gnu-gcc can be searched from the directories specified in$PATH. Alternatively, you can use GNU LoongArch Toolchain by adding the following to config.toml:

[target.loongarch64-unknown-linux-gnu]
# ADJUST THIS PATH TO POINT AT YOUR TOOLCHAIN
cc = "/TOOLCHAIN_PATH/bin/loongarch64-unknown-linux-gnu-gcc"
cxx = "/TOOLCHAIN_PATH/bin/loongarch64-unknown-linux-gnu-g++"
ar = "/TOOLCHAIN_PATH/bin/loongarch64-unknown-linux-gnu-ar"
ranlib = "/TOOLCHAIN_PATH/bin/loongarch64-unknown-linux-gnu-ranlib"
linker = "/TOOLCHAIN_PATH/bin/loongarch64-unknown-linux-gnu-gcc"

Cross-compilation

This target can be cross-compiled on a x86_64-unknown-linux-gnu host. Cross-compilation on other hosts may work but is not tested.

Testing

To test a cross-compiled binary on your build system, install the qemu binary that supports the LoongArch architecture and execute the following commands.

CC_loongarch64_unknown_linux_gnu=/TOOLCHAIN_PATH/bin/loongarch64-unknown-linux-gnu-gcc \
CXX_loongarch64_unknown_linux_gnu=/TOOLCHAIN_PATH/bin/loongarch64-unknown-linux-gnu-g++ \
AR_loongarch64_unknown_linux_gnu=/TOOLCHAIN_PATH/bin/loongarch64-unknown-linux-gnu-gcc-ar \
CARGO_TARGET_LOONGARCH64_UNKNOWN_LINUX_GNUN_LINKER=/TOOLCHAIN_PATH/bin/loongarch64-unknown-linux-gnu-gcc \
# SET TARGET SYSTEM LIBRARY PATH
CARGO_TARGET_LOONGARCH64_UNKNOWN_LINUX_GNUN_RUNNER="qemu-loongarch64 -L /TOOLCHAIN_PATH/TARGET_LIBRAY_PATH" \
cargo run --target loongarch64-unknown-linux-gnu --release

Tested on x86 architecture, other architectures not tested.

Building Rust programs

Rust does not yet ship pre-compiled artifacts for this target. To compile for this target, you will either need to build Rust with the target enabled (see "Building the target" above), or build your own copy of std by using build-std or similar.

If rustc has support for that target and the library artifacts are available, then Rust static libraries can be built for that target:

$ rustc --target loongarch64-unknown-linux-gnu your-code.rs --crate-type staticlib
$ ls libyour_code.a

On Rust Nightly it's possible to build without the target artifacts available:

cargo build -Z build-std --target loongarch64-unknown-linux-gnu