sdlamp2/docs/TOOLCHAIN.md
Michael Smith 71debd0be2 Update docs to reflect arm64 Docker build container
Replace Buildroot toolchain references with the new docker-arm64 setup
in CLAUDE.md, TOOLCHAIN.md, and the changelog.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-13 14:08:58 +01:00

2.9 KiB
Raw Blame History

Cross-Compilation Toolchain

This document describes the target device and the arm64 Docker build container used to produce binaries for it.

Target Device

Hardware

  • Device: Anbernic RG35XX Plus
  • SoC: Allwinner H700 — quad-core ARM Cortex-A53 @ 1.5 GHz (AArch64 / ARMv8-A)
  • GPU: Mali G31 MP2
  • RAM: 1 GB LPDDR4
  • Display: 640×480 IPS

Software

  • OS: Ubuntu 22.04 LTS (Jammy Jellyfish) — modified stock firmware
  • Kernel: Linux 4.9.170 aarch64 (proprietary, no source released by Anbernic)
  • Architecture: aarch64 / arm64 (confirmed via dpkg --print-architecture)
  • glibc: 2.35

Libraries on Device

All required shared libraries are pre-installed. Most are at /usr/lib/, some at /usr/lib/aarch64-linux-gnu/ (Debian multiarch path):

Library Soname Notes
SDL2 libSDL2-2.0.so.0.12.0 SDL 2.0.12
SDL2_image libSDL2_image-2.0.so.0.900.0 SDL2_image 2.0.9, at multiarch path
libavcodec libavcodec.so.58 FFmpeg ~4.x
libavformat libavformat.so.58 FFmpeg ~4.x
libavutil libavutil.so.56 FFmpeg ~4.x
libswresample libswresample.so.3 FFmpeg ~4.x

Implications for Cross-Compilation

  • The device userland is Debian/Ubuntu-based (has dpkg, apt-get, systemd)
  • Shared libraries are already present — no need to bundle or build them via Buildroot
  • A native aarch64 compile (e.g. inside an arm64 Docker container) produces working binaries
  • Must link against glibc ≤ 2.35 (use GCC ≤ 12 to avoid GLIBCXX version mismatches)

Build Container

The docker-arm64/ directory contains a Docker setup that runs an arm64 Ubuntu 22.04 container via QEMU user-mode emulation. This matches the target device exactly — same distro, same glibc 2.35, same library versions. The project's native make (using pkg-config) works as-is inside the container, no cross-compilation flags needed.

Prerequisites

QEMU binfmt handlers must be registered on the host (one-time setup, persists across reboots):

docker run --privileged --rm tonistiigi/binfmt --install arm64

Usage

From the docker-arm64/ directory:

make build              # one-shot: build sdlamp2 inside the container
make shell              # interactive bash shell for development
make clean              # remove the Docker image

The container mounts the project root at /workspace. Output binary is build/sdlamp2 (ELF 64-bit ARM aarch64).

Image Contents

  • Base: ubuntu:22.04 (arm64)
  • Build tools: build-essential, pkg-config
  • SDL2: libsdl2-dev, libsdl2-image-dev
  • FFmpeg: libavformat-dev, libavcodec-dev, libavutil-dev, libswresample-dev

The image is tagged arm64-dev and is generic enough to reuse for other projects targeting the same device.