No description
Find a file
2026-05-04 19:09:56 +02:00
examples Remove Claude worktrees from repository 2026-05-04 19:09:56 +02:00
.DS_Store Initial commit 2026-05-04 18:00:38 +02:00
.gitignore Remove Claude worktrees from repository 2026-05-04 19:09:56 +02:00
cris-toolchain.tar.gz Initial commit 2026-05-04 18:00:38 +02:00
gitignore Dateien nach „/“ hochladen 2026-05-02 23:20:43 +02:00
install-cris-toolchain.sh Dateien nach „/“ hochladen 2026-05-02 23:20:04 +02:00
LICENSE Dateien nach „/“ hochladen 2026-05-02 23:20:04 +02:00
README.md README.md aktualisiert 2026-05-02 23:22:44 +02:00

cris-toolchain-installer

Cross-Compile-Toolchain für die Axis ETRAX 100LX CPU. Baut GCC 4.6.4 + binutils 2.24 für cris-axis-linux-gnu aus den GNU-Sources, mit den nötigen Workarounds für moderne Linux-Distributionen.

Zielhardware: Acme FOX Board LX416/LX832, Axis Network Cameras (200er-Serie), Axis Print Server und ähnliche ETRAX-100LX-basierte Geräte.

Hintergrund

Die ursprünglichen Toolchain-Quellen sind nicht mehr verfügbar:

  • Acme's Phrozen SDK (terzo.acmesystems.it/foxsdk.zip) ist offline
  • Axis' cris-dist-RPMs (developer.axis.com/download/) sind offline
  • Auch Wayback Machine hat keine vollständigen Snapshots

Auf modernem Ubuntu/Mint/Debian läuft die historische Toolchain nicht ohne Anpassungen. Konkrete Probleme:

  • Header-Bug in den Linux-2.6-Kernel-Tarballs für CRIS (fehlende arch-v10/Kbuild)
  • GCC 4.6.4 lässt sich nicht mit GCC 13+ als Host-Compiler bauen (strikteren Warnings)
  • Modernes Texinfo (7.x) bricht bei GCC 4.6.4's Doku-Sources ab

Dieses Repo löst das durch ein Skript das die Toolchain aus dauerhaft verfügbaren Quellen (ftp.gnu.org, kernel.org) selbst baut, mit allen Patches integriert.

Unterstützte Distributionen

Verifiziert auf:

  • Ubuntu 22.04 LTS / 24.04 LTS
  • Linux Mint 21 / 22 (22.3 verifiziert)
  • Debian 12 (Bookworm)

Funktioniert vermutlich auch auf Ubuntu-Derivaten (Pop!_OS, Elementary OS, Zorin OS, KDE Neon).

Nicht unterstützt:

  • Fedora, Arch, openSUSE — VM oder Container nutzen
  • macOS — Docker oder VM nutzen
  • Windows — WSL2 mit Ubuntu

Installation

git clone https://git.fxrz.de/User1337/etrax-cross-compiler.git
cd cris-toolchain-installer
chmod +x install-cris-toolchain.sh
./install-cris-toolchain.sh

Das Skript fragt am Anfang alle Optionen ab (Modus, Pfade, PATH-Update, Cleanup) und läuft dann ohne weitere Interaktion durch. Dauer:

  • Tarball-Modus: ~2 Minuten
  • Source-Build: 3060 Minuten je nach CPU

Kommandozeilen-Optionen

./install-cris-toolchain.sh           # Default: Live-Output im Terminal + Logfiles
./install-cris-toolchain.sh --quiet   # Stiller Modus, nur Logfiles
./install-cris-toolchain.sh --help    # Hilfe

Installationsergebnis

Standard-Prefix /usr/local/cris/:

/usr/local/cris/
├── bin/
│   ├── cris-axis-linux-gnu-gcc       # C-Compiler
│   ├── cris-axis-linux-gnu-as        # Assembler
│   ├── cris-axis-linux-gnu-ld        # Linker
│   └── cris-axis-linux-gnu-*         # Weitere binutils-Tools
├── cris-axis-linux-gnu/
│   └── include/                       # Linux-Kernel-Headers für CRIS
├── lib/
└── libexec/

Beispiele

Im examples/-Ordner:

Datei Zweck
nolib.c Minimaltest — return 42, prüft ob Compiler funktionsfähig ist
hello.c Hello World mit direktem write()-Syscall via Inline-Assembly
guess.c Zahlenrate-Spiel — demonstriert read()/write()/time()-Syscalls und einen LCG-RNG

Build:

cd examples
make
make verify
# nolib:     ELF 32-bit LSB executable, Axis cris, version 1 (SYSV), statically linked
# hello:     ELF 32-bit LSB executable, Axis cris, version 1 (SYSV), statically linked
# guess:     ELF 32-bit LSB executable, Axis cris, version 1 (SYSV), statically linked

Auf das Zielsystem übertragen:

# Per scp (mit Legacy-SSH-Algorithmen für alte Boards):
scp -O -oHostKeyAlgorithms=+ssh-rsa,ssh-dss \
       -oKexAlgorithms=+diffie-hellman-group1-sha1 \
       hello root@<board-ip>:/var/

# Oder per FAT32-USB-Stick:
mount -t vfat /dev/sda1 /mnt/usb
cp /mnt/usb/hello /var/
chmod +x /var/hello
/var/hello

Was funktioniert, was nicht

Funktioniert:

  • C-Compilation für CRIS v10 (ETRAX 100LX)
  • Statisches Linken
  • Direkte Linux-Syscalls via Inline-Assembly
  • Verifikation mit file(1) (Output enthält Axis cris)

Nicht im Standard-Setup:

  • C++ — Skript konfiguriert nur --enable-languages=c, kann erweitert werden
  • libc — der Bootstrap-Compiler hat kein printf/malloc/etc. Drei Lösungswege:
    1. Eigene Syscall-Wrapper schreiben (siehe examples/)
    2. libc/Header vom laufenden Zielsystem kopieren (siehe FAQ)
    3. uClibc separat cross-bauen
  • Dynamic linking — Compiler ist statisch konfiguriert (--with-newlib)

Versionen und Begründung

Komponente Version Begründung
binutils 2.24 Letzte Version mit gutem CRIS-Support, baut auf alten und modernen Hosts
GCC 4.6.4 Stabile Version für CRIS — neuere haben unklaren Support, ältere fehlen Features
Linux-Headers 2.6.39.4 Letzte 2.6.x, kompatibel mit FOX-Board-Kernel (typisch 2.6.15)

Workarounds

Drei Patches im Skript für moderne Linux-Hosts:

1. Stub-Kbuild-Files für CRIS-Architektur

Der 2.6.x-Kernel-Tarball für CRIS hat einen Bug: arch/cris/include/asm/Kbuild referenziert arch-v10/Kbuild und arch-v32/Kbuild, die im Tarball aber fehlen. Ohne die Files bricht make headers_install mit "No rule to make target arch-v10/Kbuild" ab. Das Skript legt leere Stub-Files an, bevor es den Header-Install startet.

2. Host-GCC-Kompatibilität

GCC 4.6.4 (von 2013) hat in seinem eigenen Sourcecode Konstrukte die GCC 6+ als Errors statt Warnings markiert (narrowing conversions, implicit declarations, etc.). Das Skript erkennt den Host-GCC-Major-Version und setzt für GCC 6+ automatisch CFLAGS="-O2 -w" und CXXFLAGS="-O2 -w -fpermissive -std=gnu++03".

3. Texinfo-Doku-Build deaktivieren

Texinfo 7.x (Ubuntu 24.04) ist strikter als 4.x (von 2013) und bricht bei GCC 4.6.4's .texi-Sources ab. Da die GCC-Manuals für die Cross-Compile-Funktion irrelevant sind, wird der Doku-Build über MAKEINFO=true (no-op) übersprungen.

Hardware-Hintergrund

ETRAX 100LX (Axis Communications):

  • 32-bit RISC, CRIS v10 ISA, 100 MHz, 100 MIPS
  • Integriertes 10/100 Ethernet
  • USB Host, IDE, SCSI, RS232, GPIO
  • Linux-Mainline-Support: Kernel 2.4 bis 4.16 (entfernt 2018)

Verbreitete Geräte:

  • Acme FOX Board LX416 (4 MB Flash, 16 MB RAM) und LX832 (8 MB Flash, 32 MB RAM)
  • Axis Network Cameras 207, 211, 241, 282
  • Axis Print Server 540+
  • Diverse Network-Storage- und Embedded-Boards der Mid-2000er

FAQ

Wie kommt mein C-Programm aufs Zielsystem?

  • scp über Netzwerk (mit Legacy-Cipher-Optionen für alte SSH-Daemons)
  • USB-Stick mit FAT32 (mount via vfat)
  • Serial Console mit uuencode/uudecode als Fallback

Wo bekomme ich eine libc her?

  • Vom laufenden Zielsystem kopieren (garantiert ABI-kompatibel):
    scp -O -r root@<ip>:/usr/include/* /usr/local/cris/cris-axis-linux-gnu/include/
    scp -O -r root@<ip>:/usr/lib/* /usr/local/cris/cris-axis-linux-gnu/lib/
    
  • uClibc separat cross-bauen
  • Eigene Mini-libc schreiben (siehe examples/ für den Ansatz)

Skript bricht ab — wo finde ich den Fehler?

Logfiles:

  • ~/cris-build/build/binutils/{configure,build,install}.log
  • ~/cris-build/build/gcc/{configure,build,install}.log
  • /tmp/kernel-headers.log
  • /tmp/gcc-prereqs.log

Die letzten 50 Zeilen vor dem Abbruch zeigen meist die eigentliche Ursache:

tail -50 ~/cris-build/build/gcc/build.log

Kann ich das Skript anpassen, andere Versionen verwenden?

Ja. Alle Versionen sind als Variablen am Anfang des Skripts definiert (BINUTILS_VERSION, GCC_VERSION, KERNEL_VERSION). Bei abweichenden Versionen können neue Workarounds nötig werden.

Lizenz

MIT License (siehe LICENSE). Die installierte Toolchain unterliegt den jeweiligen Original-Lizenzen: GCC und binutils GPLv3, Linux-Headers GPL-2.0-WITH-Linux-syscall-note.