Created on 2016-08-17 21:45
Published on 2016-08-17 22:13
Published on August 17, 2016
MAGENTA - HOW TO RUN YOUR OWN C SOURCE CODE BINARY
On August 15th, Google unveiled a new operative embedded system called Fuchsia based on Magenta kernel. Here below you will find a step by step guide to compile and run this new kernel under qemu. Moreover a manual tool-chain configuration in order to compile your own C-source example code.
The target architecture chosen is Arm64 CPU type arm926ej-s and the host is Ubuntu Linux 14.04 x86-64. The list of package in the following may not be fully exhaustive, especially if you install Ubuntu from scratch.
sudo apt-get install git libc-dev-bin gcc-multilib curl
mkdir -p fuchsia
pushd fuchsia
git clone https://fuchsia.googlesource.com/buildtools
git clone https://fuchsia.googlesource.com/magenta
pushd buildtools/
./update.sh
popd
sudo apt-get install texinfo libglib2.0-dev autoconf libsdl-dev \
build-essential bison flex
TARGET_ARCH="aarch64"
declare -i N_CPUS=$(nproc)
SYSROOT=$PWD/buildtools/sysroot
git clone https://fuchsia.googlesource.com/third_party/gcc_none_toolchains
ln -sf gcc_none_toolchains toolchain
pushd toolchain
./doit -a $TARGET_ARCH -f -j$N_CPUS
popd
TCBIN_PATH=$(readlink -f $PWD/toolchain/$TARGET_ARCH-*/bin)
export PATH=$PATH:$TCBIN_PATH
pushd magenta
make -j$N_CPUS magenta-qemu-arm64
popd
git clone https://fuchsia.googlesource.com/third_party/qemu
pushd qemu
git checkout fuchsia
./configure --target-list=$TARGET_ARCH-softmmu \
--prefix=$PWD/../qemu-runtime
make -j$N_CPUS install
export PATH=$PWD/../qemu-runtime/bin:$PATH
popd
pushd magenta/build-magenta-qemu-arm64
declare -i REAL_MEM_KB QEMU_MEM_MB N_CPUS_QEMU
N_CPUS_QEMU=$[(N_CPUS+1)/2]
REAL_MEM_KB=$(grep -e ^MemTotal: /proc/meminfo | tr -cd [0-9])
QEMU_MEM_MB=$[($REAL_MEM_KB+1024)/2048]
test $QEMU_MEM_MB -gt 512 && QEMU_MEM_MB=512
qemu-system-$TARGET_ARCH -m $QEMU_MEM_MB -nographic \
-machine virt -cpu cortex-a53 -kernel magenta.elf -append ''
#> ls /boot/bin
#> core-tests
#> thread-depth-test
#> dlog
# to terminate qemu
CTRL-A X
popd
export CC=aarch64-elf-gcc
export CXX=aarch64-elf-g++
export LD=aarch64-elf-ld.gold
export AR=aarch64-elf-ar
export AS=aarch64-elf-as
export NM=aarch64-elf-nm
export STRIP=aarch64-elf-strip
export RANLIB=aarch64-elf-ranlib
export DLLTOOL=aarch64-elf-dlltool
export OBJDUMP=aarch64-elf-objdump
export RESCOMP=aarch64-elf-windres
export WINDRES=aarch64-elf-windres
CFLAGS="-Wall -Wextra -ffunction-sections -fdata-sections -fPIC -mcpu=cortex-a53 -std=c11"
CFLAGS="$CFLAGS -include config-global.h -include config-user.h"
CFLAGS="$CFLAGS $(for i in $(find ../global ../system ../third_party -name include); do echo -n "-I $i "; done)"
export CFLAGS
export HOSTING_CRT0=./ulib/crt1.o
LIB_PATH_1=$(dirname $TCBIN_PATH)/lib/gcc/$TARGET_ARCH-elf/5.3.0
LDFLAGS="-s -nostdlib -Lkernel -Lsystem -Lthird_party -z max-page-size=4096 --gc-sections -z combreloc -z relro -z now -z text --hash-style=gnu --eh-frame-hdr --build-id -pie -dynamic-linker ld.so.1 $HOSTING_CRT0"
export LDFLAGS
EXTRA_LIBS="$(find ./ulib/ -name \*.so.abi) $LIB_PATH_1/libgcc.a"
cp -f ../third_party/uapp/kilo/kilo.c chilo.c
wget -c roberto.foglietta.name/pub/mk/armstrong.c
rm -f chilo.o chilo armstrong.o armstrong extra.bootfs
$CC $CFLAGS -c armstrong.c -o armstrong.o
$CC $CFLAGS -c chilo.c -o chilo.o -fPIC -Wno-unused-parameter
$LD $LDFLAGS armstrong.o $EXTRA_LIBS -o armstrong
$LD $LDFLAGS chilo.o $EXTRA_LIBS -o chilo
file chilo armstrong
echo "bin/armstrong=./armstrong" > extra.manifest
echo "bin/chilo=./chilo" >> extra.manifest
../../buildtools/mkbootfs -o extra.bootfs extra.manifest
sync
qemu-system-$TARGET_ARCH -m $QEMU_MEM_MB -nographic \
-machine virt -cpu cortex-a53 -kernel magenta.elf -initrd extra.bootfs -append ''
(C) 2016, Roberto A. Foglietta, licensed under Creative Common Attribution-NonCommercial-ShareAlike 4.0 International terms (CC BY-NC-SA 4.0).