[precedente] Vantaggi - Copertina - Posta [successivo]

Articolo


Cross compiler

Un grande vantaggio dei sistemi UNIX e quindi anche di linux è la possibilità di poter compilare lo stesso programma su diverse piattaforme, con minime modifiche, avendo a disposizione il codice sorgente.
Utilizzando le utility della GNU si può anche creare il file binario per una piattaforma diversa, da quella su cui si compila. Facciamo un esempio per rendere le cose più chiare. Abbiamo un pc A ix86 compatibile con linux ed una macchina B Alpha anch'essa con Linux; possiamo utilizzare A per creare programmi binari per B, per mezzo di Cross Compiler.

Un compilatore utilizza due fasi, nella prima analizza il codice sorgente da eventuali errori ecc, la seconda trasforma il file scritto, ad esempio in C, in assembler.
Naturalmente l'assembler dipende da CPU a CPU, quindi mentre la prima fase è uguale per tutte, la seconda dipende dalle rispettive istruzioni macchina della CPU. Il compilatore gcc della GNU ha la possibilità di scegliere, in fase di compilazione dello stesso, per quale CPU creare le istruzioni assembler. Ad esempio se in C abbiamo una istruzione int a, essa dice al compilatore di riservare un area di memoria di 2 byte, per ix86 equivale in assembler a pippo, mentre per Alpha a pluto. Alla fine basta dare al compilatore il set di istruzioni assembler per la particolare CPU, modificando in questo modo solo una piccola parte del compilatore stesso. Per creare un programma binario, in generale, abbiamo bisogno:

Compilatore file.c-> file.s
Assemblatore file.s->file.o
Linker e Libreria file.o->file (eseguibile)

Abbiamo bisogno quindi dei sorgenti di:

binutils (2.9.1.0.4)
gcc o egcs ( 1.1b)
libc (2.0.97)

tra parentesi ci sono le versioni da me usate per creare un cross compiler per Alpha. Decidiamo di installare i binari e librerie nella directory /home/cross/alpha ed /path/src la directory dove scompattare e compilare, poi basta eseguire in ordine: export PATH=$PATH:/home/cross/alpha/bin

ASSEMBLATORE E LINKER


#cd /path/src tar -zxvf binutils-2.9.1.0.4.tar.gz
#cd binutils-2.9.1.0.4
#mkdir build
#cd build
#export CFLAGS=-O2
#export CXXFLAGS=-O2
#../configure --target=alpha-pc-linux-gnu --prefix=/home/cross/alpha
--disable-shared -v;make all install

COMPILATORE


#cd /path/src
#tar -zxvf egcs-1.1b.tar.gz
#cd egcs-1.1b
#cd gcc
#mkdir build
#cd build
#export CFLAGS=-O2
#export CXXFLAGS=-O2
#../configure --target=alpha-pc-linux-gnu --prefix=/home/cross/alpha
--disable-shared --with-gnu-ld --with-gnu-as

Editare il file Makefile ed aggiungere alla variabile LIBGCC2_FLAGS -Dinhibit_libc

make; make install

LIBRERIA


#cd /path/src
#tar -zxvf glibc-2.0.97.tar.gz
#cd glibc-2.0.97
#tar -zxvf glibc-linuxthreads-2.0.97.tar.gz
#tar -zxvf glibc-crypt.2.0.97.tar.gz
#export CC=alpha-pc-linux-gnu
#export CFLAGS=-O2
#rm /usr/src/linux/include/asm
#ln -sf /usr/src/linux/include/asm-alpha /usr/src/linux/include/asm
#mkdir build
#cd build
#../configure --enable-add-ons=linuxthreads,crypt --host=alpha-pc-linux-gnu
--prefix=/home/cross/alpha --with-binutils=/home/cross/alpha/bin 
--with-headers=/usr/src/linux/include --disable-shared --with-elf
#make ;make install

Si può anche compilare il kernel per Alpha, basta solo l'assemblatore ed il compilatore; basta editare il Makefile in /usr/src/linux/ e modificare la variabile ARCH=alpha ed CROSS_COMPILE= alpha-pc-linux-gnu- ed poi eseguire:


#make menuconfig
#make clean
#make dep
#make zImage

In questo modo potete crearvi una distribuzione Linux per una CPU , basta avere solo il codice sorgente. Bello NO!!!!!!!!!!!!!!!!!!

di Gerardo Di Iorio

[precedente] Vantaggi - Copertina - Posta [successivo]