This is a frequently updating doc, and you can find its latest version here.

This documentation aims to help you set up an Arch Linux RISC-V (riscv64gc) development environment powered by usermode QEMU and systemd-nspawn.

Currently, the documentation contains instructions for Arch Linux, Debian and Ubuntu.

1. Prepare the Container

Arch Linux

1.1 Add [archlinuxcn] Repo Source

We need to install some packages from [archlinuxcn] later.

Append these two lines to /etc/pacman.conf:

1
2
[archlinuxcn]
Server = https://repo.archlinuxcn.org/$arch

There is also a list of public mirrors available.

After doing so, you need to trust the archlinuxcn maintainers' PGP keys to install packages from it:

1
$ sudo pacman -Sy && sudo pacman -S archlinuxcn-keyring

1.2 Install Packages

1
$ sudo pacman -S qemu-user-static binfmt-qemu-static

where binfmt-qemu-static is for registering QEMU interpreter to execute RISC-V ELF files. Other necessary packages like zstd and systemd-nspawn are listed in the dependency tree of base meta package, so they will also be installed by the provided command, hence there's no need to install them explicitly.

Debian and Ubuntu

1
$ sudo apt install zstd qemu-user-static systemd-container

where zstd is for decompressing the Arch Linux RISC-V rootfs compressed tarball, and systemd-container is for the systemd-nspawn command, which we'll use later to spawn a container from the rootfs.

1.3 Download the rootfs

1
2
3
$ curl -O https://archriscv.felixc.at/images/archriscv-20210601.tar.zst
$ sha512sum archriscv-20210601.tar.zst
6f012a169fe6f1ea15aeb3283091466e7992f78d823951ee2170940fa030e7fa2394aee11bf67c29943d21579ab42d2262a3d5ca973b5de8be779f338ba1dd44 archriscv-20210601.tar.zst

1.4 Decompress the rootfs

Arch Linux

1
2
$ mkdir archriscv
$ sudo bsdtar -xf archriscv-20210601.tar.zst -C archriscv

Debian and Ubuntu

1
2
$ mkdir archriscv
$ sudo tar -I zstd -xf archriscv-20210601.tar.zst -C archriscv

tar may spit out some warnings, which turn out to be harmless and we can safely ignore them.

2 Start the Container

1
$ sudo systemd-nspawn -D ./archriscv -a -U

where -D provides the root directory for the container, -a for preventing processes with PID 1 doesn't reap zombie children, -U for preventing processes in container to use the same UID range as those used outside the container.

2.1 Check the Architecture

1
2
# uname -m
riscv64

2.2 System Upgrade

1
# pacman -Syu

2.3 (Optional) Install Packages

For example, if you want to install vim:

1
# pacman -S vim

2.4 (Optional) Set Default Editor

1
# echo 'export EDITOR=vim' >> ~/.bashrc && source ~/.bashrc

2.5 (Optional) Create a Regular User for Development

1
# useradd -m <username>

where -m means to create a home directory for the user to be added.

Use visudo if you'd like to grant sudo privilege for this user, and append this line under ## User privilege specification:

1
<username> ALL=(ALL) NOPASSWD: ALL

2.6 (Optional) Switch to the Regular User

1
2
3
4
5
# exec su username
$ cd ~
$ pwd
/home/<username>
$ echo 'export EDITOR=vim' >> ~/.bashrc && source ~/.bashrc

3 Compile and Run a Program

This guide is about compile & run a program manually. If you want to start your development from a git repo or so, jump to 3.2 Compile for instructions on how to install git and other packages needed by your toolchain. If you are trying to create or modify an Arch Linux package (i.e. dealing with a PKGBUILD), you may refer to related ArchWiki pages.

3.1 Coding

Run vim hello.c and type:

1
2
3
4
5
6
#include <stdio.h>

int main(int argc, char *argv[]) {
printf("Hello RISC-V!\n");
return 0;
}

Exit with esc and :wqEnter, as this s/o answer suggested :-P

3.2 Compile

First of all, update your local packages repo data from remote package sources (like sudo apt-get update):

1
$ sudo pacman -Sy

You should run this prior to any attempt to install a package, unless you are sure that your local copy of package info is up-to-date.

Then, install your development toolchain:

1
$ sudo pacman -S gcc cmake foo bar bah

Compile your code:

1
$ gcc -o hello hello.c

3.3 Check File Format

1
2
$ file hello
hello: ELF 64-bit LSB pie executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64-lp64d.so.1, BuildID[sha1]=4a75c57e4e99654dca0d6dc91689dffbbe7dc581, for GNU/Linux 4.15.0, not stripped

3.4 Run the Program

1
2
$ ./hello
Hello RISC-V!

来源:https://blog.jiejiss.com/