Skip to main content

The xPack GNU RISC-V Embedded GCC Frequently Asked Questions

Why do I get unrecognized opcode csrr?

Starting with GCC 12.x, the compiler implements the new RISC-V ISA, which introduces an incompatibility issue

The solution is to add _zicsr and/or _zifencei to the -march option, e.g. -march=rv32imac becomes -march=rv32imac_zicsr_zifencei.

There are two RISC-V toolchains, riscv64-unknown-elf-gcc and riscv32-unknown-elf-gcc (or riscv64-none-elf-gcc and riscv32-none-elf-gcc); you have only one. How can you generate 32 and 64-bit code?

All RISC-V GCC toolchains, if built correctly, are able to generate both 32/64-bit code, based on -march and -mabi. Thus a single version is enough for all use cases.

Why riscv-none-elf-gcc and not riscv-none-eabi-gcc, as Arm uses?

For the moment RISC-V does not define an EABI (Embedded ABI) and uses the same Unix ABI for embedded applications too, thus -eabi- would not be accurate.

Nix also provides reproducible builds, why not use it?

The short answer is… “because of Windows”.

Nix is a remarkable project that carefully controls versions down to individual libraries. However, it relies on file links, which are either unavailable or unreliable on Windows.

As a result, Nix is currently only available on GNU/Linux and, with some limitations, on macOS. Additionally, mastering the Nix language requires significant effort.

Flatpack & Snap also promise universal packages, why not use them?

The short answer is… “because they run only on GNU/Linux”.

Both Flatpack and Snap hold promise as the future of application distribution. While they may eventually achieve this, they are currently specific to GNU/Linux, with very little chance of expanding to other platforms.