Testing non-native architectures with QEMU

This page shows how to test Mbed TLS on Linux for CPUs you don’t have, assuming the target CPU can also run Linux.

Preparing Ubuntu for building and testing with QEMU

Add other targets to your package sources in a new file /etc/apt/sources.list.d/ubuntu-foreign.list. Note that ordinary Ubuntu mirrors only have PC builds, so you need a ports mirror. For example:

deb [arch=arm64,armhf,ppc64,s390x] http://fr.ports.ubuntu.com/ubuntu-ports focal main restricted universe multiverse
deb [arch=arm64,armhf,ppc64,s390x] http://fr.ports.ubuntu.com/ubuntu-ports focal-security main restricted universe multiverse
deb [arch=arm64,armhf,ppc64,s390x] http://fr.ports.ubuntu.com/ubuntu-ports focal-updates main restricted universe multiverse

Then install libc6-dev for the desired architectures.

sudo apt-get update
sudo apt-get install libc6-dev:arm64 libc6-dev:armhf libc6-dev:ppc64 libc6-dev:s390x

Testing with qemu-user on Linux

Cmake build

For example for aarch64:

mkdir build-aarch64
cd build-aarch64
CC=clang CFLAGS="--target=aarch64-linux-gnu" cmake -DCMAKE_BUILD_TYPE=Release ..
make -j2
cd tests
qemu-aarch64 -L /usr/aarch64-linux-gnu ./test_suite_mpi

mtest

With mtest:

mtest <arch> <test names>

e.g.

mtest aarch64 cmac

mbedtls-prepare-build

With mbedtls-prepare-build:

mbedtls-prepare-build -d build-aarch64 --cc=clang --cflags='-O2 -target aarch64-linux-gnu' --qemu-ld-prefix=aarch64-linux-gnu
make -C build-aarch64 test