- Shell 100%
| examples | ||
| .DS_Store | ||
| .gitignore | ||
| cris-toolchain.tar.gz | ||
| gitignore | ||
| install-cris-toolchain.sh | ||
| LICENSE | ||
| README.md | ||
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: 30–60 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ältAxis 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:- Eigene Syscall-Wrapper schreiben (siehe
examples/) - libc/Header vom laufenden Zielsystem kopieren (siehe FAQ)
- uClibc separat cross-bauen
- Eigene Syscall-Wrapper schreiben (siehe
- 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/uudecodeals 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.