Der erste (Crosscompile-)Versuch

Heute sollte es also langsam mal damit losgehen, Samba auf die Fritz!Box zu bekommen. Passenderweise fiel mir dazu direkt eine “Schritt-für-Schritt”-Anleitung in die Hände, welche das Aufsetzen der Crosscompile-Umgebung (= Erzeugen von Binaries für MIPS-Architektur auf einem x86 bzw. x86_64-System) zum Kinderspiel machen sollte (an dieser Stelle vielen Dank an HH für’s zusenden!)

Zuerst habe ich mir also in einer virtuellen Maschine ein Debian Sarge 3.1r0a installiert, welche zum kompilieren der Quellpakete für die MIPS-Plattform dienen soll (ich habe mich hier für eine VM entschieden, um mein Linux-Setup, womit ich tagtäglich arbeite, nicht unnötig “strubbelig” zu machen). Die Installation bestand dabei aus einem einfachen Basissystem mit GCC usw., angepasst an meine Umgebung. Einige Softwarepakete, die (imho) das Arbeiten auf der Shell einfacher halten (z.B. Midnight Commander) dürfen dabei natürlich nicht fehlen :)

Anschließend dann “einfach” nach Anleitung als root-User die MIPS-Crosscompile-Toolchain installiert:

1. Paketquelle zur sources.list hinzufügen:

# echo deb http://debian.speedblue.org ./ >> /etc/apt/sources.list

2. MIPS-Toolchain installieren:

# apt-get install binutils-mipsel glibc-cross-mipsel gcc-3.3-mipsel

3. Da AVM die Toolchain an bestimmter Stelle erwartet, Symlinks erzeugt ($USER durch den Username ersetzen, mit welchem später kompiliert werden soll):

# mkdir /home/mipsel
# mkdir /home/mipsel/compiler
# mkdir /home/mipsel/compiler/bin
# chown -R $USER /home/mipsel
# ln -s /usr/mipsel/bin/mipsel-linux-ar /home/mipsel/compiler/bin/mipsel-glibc-linux-ar
# ln -s /usr/mipsel/bin/mipsel-linux-gcc /home/mipsel/compiler/bin/mipsel-glibc-linux-gcc
# ln -s /usr/mipsel/bin/mipsel-linux-ld /home/mipsel/compiler/bin/mipsel-glibc-linux-ld
# ln -s /usr/mipsel/bin/mipsel-linux-nm /home/mipsel/compiler/bin/mipsel-glibc-linux-nm
# ln -s /usr/mipsel/bin/mipsel-linux-objcopy /home/mipsel/compiler/bin/mipsel-glibc-linux-objcopy
# ln -s /usr/mipsel/bin/mipsel-linux-ranlib /home/mipsel/compiler/bin/mipsel-glibc-linux-ranlib
# ln -s /usr/mipsel/bin/mipsel-linux-strip /home/mipsel/compiler/bin/mipsel-glibc-linux-strip
# ln -s /usr/mipsel/bin/mipsel-linux-ranlib /home/mipsel/compiler/bin/mipsel-linux-ranlib

4. Verzeichnisse für die Fritz!Box Sourcefiles anlegen:

# mkdir fritzbox ; cd fritzbox

5. Aktuelles Quellpaket von AVM runterladen:

# wget ftp://ftp.avm.de/develper/opensrc/fritzbox-source-files-current.tar.gz

6. Aktuellste Firmware vom AVM FTP-Server runterladen und im aktuellen Verzeichnis ablegen

7. Quellpaket auspacken:

# tar -xzf fritzbox-source-files-current.tar.gz

8. Kernel-Sourcen vorbereiten und kompilieren:

# ./make-kernel.sh <Dateiname des Original-Firmware-Images>

9. Wenn das geklappt hat, ins Unterverzeichnis GPL wechseln, base-src*.tar.gz auspacken und kompilieren (das sind busybox und die uClibc). Dazu muß man wissen, daß das Makefile eine Umgebungsvariable namens “KERNEL_LAYOUT” erwartet, welche auf die Speichergröße der Ziel-Fritz!Box gesetzt werden muß. Im Fall der WLAN-3070 sieht das ganze dann so aus:

# cd GPL/base_4mb_build
# KERNEL_LAYOUT=”4mb” make

Das alles hat in meinem Fall problemlos geklappt, somit sollten sich also Binaries für die MIPS-Plattform bzw. die Fritz!Box erzeugen lassen. Das wird natürlich auch sofort anhand von “Hallo-Welt” ausprobiert :)

Meine Version von hello.c dazu:

#include <stdio.h>

int main()
{
printf(“Hello World!\n”);
return 0;
}

Im x86-System macht das Programm erwartungsgemäß, was es soll:

# gcc -o hello hello.c ; ./hello
Hello World!

Nun kompiliere ich das ganze für die MIPS-Plattform:

# rm hello
# /usr/mipsel/bin/mipsel-linux-gcc -o hello hello.c
# ./hello
bash: ./hello: cannot execute binary file

… was zu erwarten war, MIPS-Code sieht nunmal “geringfügig” anders aus als x86-Code :) Ich kopiere das MIPS-Binary also zum Test auf der Fritz!Box auf einen USB-Stick, stecke selbigen in die Fritz!Box und versuche, das Programm jetzt auf der Box zu starten:

# cd /var/media/ftp/…
# ./hello
-sh: ./hello: not found

Aha, “not found”… ??

Netterweise ist genau in diesem Augenblick dann der Northbridge-Lüfter auf meinem A8N-SLI, der seinen Tot mittlerweile schon seit Monaten durch entsprechende Geräuschentwicklung angekündigt hat, endgültig stehengeblieben, also war es das jetzt erstmal mit Crosscompilen, bis der Ersatzkühler eingebaut ist (= Rechner zerlegen, Mainboard raus, alten Kühler so vom Board entfernen, daß letzteres dabei NICHT beschädigt wird :) , neuen Kühler drauf…) Nunja.

Kommentieren »»