Up Embedded Linux

Aufbau eines i686-grub-linux-uClibc-busybox- Systems

Aufbau eines GNU-Crosscompilers

siehe tc47

Grub

../grub-1.99/configure --prefix=/opt/grub-1.99 --target=i686-linux-gnu

Linuxfromscrash empfiehlt: --disable-werror
Sie haben recht:
grub/core/fs/zfs hat ein strict alias - Problem.
In grub-core/Makefile wurde manuell das -Werror - Flag entfernt.

make
make install

Dann die Installation auf der gemounteten Platte, die das neue System werden soll:

i686-linux-gnu-grub-install --boot-directory=/mnt/lfs/boot /dev/sdc

Bootet man von der Platte, so wird der grub-Bootmanager geladen werden

Nach dem Erstellen des Kernels

Die Erstellung eines Menufiles grub.cfg ist etwas komplexer geworden. Es gibt aber nun i686-linux-gnu-grub-mkconfig. Leider hatten die Autoren den Nutzungsfall: "Installation eines Systems von einem anderen aus, wobei die Root-Platte des Zielsystems in das Buildsystem eingehägt ist" nicht vollständig bedacht: das Script sucht die /boot/-Partition des Buildsystems durch. Eigentlich sollte das Script einen Parameter mit dem Root des Targetsystems bekommen.
Vorerst hilft es, in dem man:

mount /dev/sdc1 /boot
cd /boot/
ln -s i686-linux-gnu-grub grub
i686-linux-gnu-grub-mkconfig > grub/grub.cfg
umount /boot

Zur Laufzeit wird im Buildsystem die /boot-Partition nicht benötigt, damit kann man dies machen.

Vorsicht: Es werden falsche Einträge erzeugt:

Diese muß man richtig stellen.

Beim Booten stellt nun GRUB das Menu dar und bootet den Kern.

Linux-Kern

wget von kernel.org, auspacken und dann:

make ARCH=x86 CROSS_COMPILE=i686-linux-gnu- oldconfig
make ARCH=x86 CROSS_COMPILE=i686-linux-gnu- menuconfig
make V=1 ARCH=x86 CROSS_COMPILE=i686-linux-gnu- bzImage modules
make V=1 ARCH=x86 CROSS_COMPILE=i686-linux-gnu- INSTALL_MOD_PATH=/mnt/lfs/root/ modules_install

(Die Variablen ARCH und CROSS_COMPILE sind ein Tip von hier und verifiziert im Linux-Makefile)

Zu beachten:

Installation Headers

(linuxfromscratch)

cd /mnt/lfs/root
mkdir -p usr/install
cd /mnt/lfs/src/linux-3.4.1/
make headers_check
make V=1 INSTALL_HDR_PATH=/mnt/lfs/root/usr/ headers_install

uClibc

Diese hängt von der libgcc ab, die dann nach dem Auspacken gebaut werden muß.

export TARGET=i686-linux-gnu
cd uClibc-0.9.33
make CROSS_COMPILE=${TARGET}- menuconfig

Bemerkungen zur Konfiguration:

make V=2 PREFIX=/mnt/lfs/root
make PREFIX=/mnt/lfs/root/ install

Achtung: Die Start-Files müssen in /opt/tc47/i686-linux-gnu/lib gelinkt werden, da sie sonst vom Crosslinker nicht gefunden werden:

cd /opt/tc47/${TARGET}/lib
ln -s /mnt/lfs/root/usr/lib/crt* .

(Damit kann nun ein Hello-Worldprogramm crosscompilert und statisch gelinkt werden, beim Kopieren auf einen i686-linux-gnu-Rechner kann dieses erfolgreich ausgeführt werden.)

busybox

Der debianutils-Teil verwendet eine Funktion tempnam, die veraltet ist, und die nicht in der uClibc enthalten ist. Der busybox-1_20_0.patch.txt verwendet eine andere Funktion.

export TARGET=i686-linux-gnu
patch -b < busybox-1_20_0.patch.txt
make CROSS_COMPILE=${TARGET}- defconfig
make CROSS_COMPILE=${TARGET}- menuconfig
Build Busybox as a static binary
Cross Compile Prefixi686-linux-gnu-
Path to Sysroot (CONFIG_SYSROOT)
Extra CFLAGS (CONFIG_EXTRA_CFLAGS)"-I/mnt/lfs/root/usr/include"
Extra LDFLAGS (CONFIG_EXTRA_LDFLAGS)"-L/mnt/lfs/root/usr/lib"

Eigentlich wollte ich SYSROOT=/mnt/lfs/root/ und EXTRA_CFLAGS=-I/usr/include, aber das funktioniert nicht mit gcc-4.7.0

make
make CONFIG_PREFIX=/mnt/lfs/root/ install

Informatik- und Netzwerkverein Ravensburg e.V Rudolf Weber