Para hacerte el cross-compiler necesitaras:
Un GNU C ya instalado versión 4.1.0 o superior. (Se mira con gcc -v)
Las binutils 2.19.1
El GCC 4.4.0
El kernel linux (la versión 2.6.x, yo lo he probado con la 2.6.29.4)
La GLIBC 2.9 o la GLIBC 2.6. Con la 2.9 has de recompilar, así que supongo que mejor para ti sería la 2.6 que con la que han compilado los de GPH (si mal no recuerdo).
GLIBC-PORTS-2.9 o GLIBC-PORTS-2.6, dependiendo de si has elegido la 2.9 o la 2.6.
Esto requiere una explicación:
La GLIBC no existe para ARM ni para MIPS ni para nada que no sea x86, así que es necesario portarla en algunas partes. Dichas partes son el paquete GCLIB-PORTS.
Actualmente (en la versión 2.6 supongo que no) hay fallos en los fuentes, fácilmente solucionables, que impiden compilar. Más adelante te diré como corregirlos.
Los glibc-threads no hacen falta. No los instales porque no sirvan para nada.
Recapitulando:
[ ] Compilador GNU instalado version 4.1.0 o mejor.
[ ] Las binutils 2.19.1
[ ] El GCC 4.4.0
[ ] El kernel linux (2.6.x, mejor la ultima version, la 2.6.29.4)
[ ] GLIBC y GLIBC-PORTS (usa la 2.6 para no tener que recompilar nada)
Configurando para la toochain:
1-Crea una carpeta donde meter los sources: por ejemplo ${HOME}/toolchain/src
2-Descomprime directamente las binutils, el gcc, la glibc y el kernel. Las glibc-ports aún no.
3-Descomprime las glibc-ports a un directorio temporal.
4-Crea una subcarpeta en donde descomprimiste la glibc llamada "ports"
5-En la 2.6 aún no sé, pero en la 2.9 hay fallos en los sources que deben ser corregidos:
glibc-2.9/nptl/sysdeps/unix/sysv/linux/lowlevellock.c
Linea 26: #include <tls.h> [añadido]
glibc-2.9/ports/sysdeps/arm/fpu/setjmp.S:
Linea 37: hidden_def (__sigsetjmp) [añadido]
Ya tienes los sources configurados.
Ahora necesitas los guiones. Estos guiones son versiones modificadas de muchos guiones que he visto por internet y que ninguno funcionaba.
build_1.sh:
Código:
#!/bin/bash
# Setup
PREFIX=<ruta absoluta a la toolchain, por ejemplo ${HOME}/toolchain>
TARGET=arm-unknown-linux-gnu
SYSROOT=${PREFIX} <--Esto puedes poner ${PREFIX}/sysroot (mira al final)
export ARCH=arm
export CROSS_COMPILE=${TARGET}-
export PATH=$PATH:${PREFIX}/bin
mkdir -p ${PREFIX}/src
# GNU binutils
cd ${PREFIX}/src
mkdir -p BUILD/binutils-2.19.1
cd BUILD/binutils-2.19.1
../../binutils-2.19.1/configure --prefix=${PREFIX} --target=${TARGET} --with-sysroot=${SYSROOT} 2>&1 | tee configure.out
make 2>&1 | tee make.out
make install 2>&1 | tee -a make.out
build_2.sh: (Actualizado)
Código:
#!/bin/bash
# Setup
PREFIX=/home/fernando/Desktop/prebuilt-toolchain/new/
TARGET=arm-unknown-linux-gnu
SYSROOT=${PREFIX}
export ARCH=arm
export CROSS_COMPILE=${TARGET}-
export PATH=$PATH:${PREFIX}/bin
#Primer GCC
cd ${PREFIX}/src
mkdir -p BUILD/gcc-4.4.0-stage1
cd BUILD/gcc-4.4.0-stage1
../../gcc-4.4.0/configure --prefix=${PREFIX} --target=${TARGET} --enable-languages=c --with-sysroot=${SYSROOT} --disable-threads --disable-libssp --disable-libgomp --disable-libmudflap --without-headers --with-newlib --enable-shared 2>&1 | tee configure.out
make 2>&1 | tee make.out
make install 2>&1 | tee -a make.out
build_3.sh:
Código:
#!/bin/bash
# Setup
PREFIX=/home/fernando/Desktop/prebuilt-toolchain/new/
TARGET=arm-unknown-linux-gnu
SYSROOT=${PREFIX}
export ARCH=arm
export CROSS_COMPILE=${TARGET}-
export PATH=$PATH:${PREFIX}/bin
# Linux Kernel Headers
cd ${PREFIX}/src
ln -sf linux-2.6.29.4 linux
cd linux
make menuconfig ARCH=arm
make include/linux/version.h
mkdir -p ${SYSROOT}/usr/include
cp -a ${PREFIX}/src/linux/include/linux ${PREFIX}/include/linux
cp -a ${PREFIX}/src/linux/include/asm-arm ${PREFIX}/include/asm
cp -a ${PREFIX}/src/linux/include/asm-generic ${PREFIX}/include/asm-generic
buid_4.sh:
Código:
#!/bin/bash
# Setup
PREFIX=/home/fernando/Desktop/prebuilt-toolchain/new/
TARGET=arm-unknown-linux-gnu
SYSROOT=${PREFIX}
export ARCH=arm
export CROSS_COMPILE=${TARGET}-
export PATH=$PATH:${PREFIX}/bin
# Glibc headers
export old_BUILD_CC=$BUILD_CC
export old_CC=$CC
export old_CXX=$CXX
export old_AR=$AR
export old_RANLIB=$RANLIB
export old_AS=$AS
export old_LD=$LD
cd ${PREFIX}/src
mkdir BUILD/glibc-2.9-headers
cd BUILD/glibc-2.9-headers
export BUILD_CC=gcc
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export RANLIB=${CROSS_COMPILE}ranlib
export AS=${CROSS_COMPILE}as
export LD=${CROSS_COMPILE}ld
../../glibc-2.9/configure --build=${TARGET} --prefix=${PREFIX} --target=${TARGET} --enable-add-ons=nptl,ports --with-headers=${PREFIX}/src/linux/include cross_compiling=yes 2>&1 | tee configure.out
make cross-compiling=yes install-headers 2>&1 | tee make.out
touch ${PREFIX}/include/gnu/stubs.h
touch ${PREFIX}/include/bits/stdio_lim.h
export BUILD_CC=$old_BUILD_CC
export CC=$old_CC
export CXX=$old_CXX
export AR=$old_AR
export RANLIB=$old_RANLIB
export AS=$old_AS
export LD=$old_LD
export old_BUILD_CC=
export old_CC=
export old_CXX=
export old_AR=
export old_RANLIB=
export old_AS=
export old_LD=
build_5.sh:
Código:
#!/bin/bash
# Setup
PREFIX=/home/fernando/Desktop/prebuilt-toolchain/new/
TARGET=arm-unknown-linux-gnu
SYSROOT=${PREFIX}
export ARCH=arm
export CROSS_COMPILE=${TARGET}-
export PATH=$PATH:${PREFIX}/bin
# glibc
export old_BUILD_CC=$BUILD_CC
export old_CC=$CC
export old_CXX=$CXX
export old_AR=$AR
export old_RANLIB=$RANLIB
export old_AS=$AS
export old_LD=$LD
cd ${PREFIX}/src
mkdir -p BUILD/glibc-2.9
cd BUILD/glibc-2.9
export BUILD_CC=gcc
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export RANLIB=${CROSS_COMPILE}ranlib
export AS=${CROSS_COMPILE}as
export LD=${CROSS_COMPILE}ld
../../glibc-2.9/configure --prefix=${PREFIX} --build=${TARGET} --target=${TARGET} --enable-add-ons=nptl,ports --with-binutils=${PREFIX}/${TARGET}/bin --with-headers=${PREFIX}/include cross_compiling=yes libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_gnu89_inline=yes 2>&1 | tee configure.out
make cross_compiling=yes 2>&1 | tee make.out
make install
export BUILD_CC=$old_BUILD_CC
export CC=$old_CC
export CXX=$old_CXX
export AR=$old_AR
export RANLIB=$old_RANLIB
export AS=$old_AS
export LD=$old_LD
export old_BUILD_CC=
export old_CC=
export old_CXX=
export old_AR=
export old_RANLIB=
export old_AS=
export old_LD=
build_6.sh:
Código:
#!/bin/bash
# Setup
PREFIX=/home/fernando/Desktop/prebuilt-toolchain/new/
TARGET=arm-unknown-linux-gnu
SYSROOT=${PREFIX}
export ARCH=arm
export CROSS_COMPILE=${TARGET}-
export PATH=$PATH:${PREFIX}/bin
export INCLUDE=${PREFIX}/include:$INCLUDE
export LD_LIBRARY_PATH=${PREFIX}/lib:$LD_LIBRARY_PATH
#GNUC final :)
cd ${PREFIX}/src
mkdir -p BUILD/gcc-4.4.0
cd BUILD/gcc-4.4.0
mkdir -p ${PREFIX}/${TARGET}/include
mkdir -p ${PREFIX}/${TARGET}/lib
cp -R ${PREFIX}/include ${PREFIX}/${TARGET}/include
cp -R ${PREFIX}/lib ${PREFIX}/${TARGET}/lib
../../gcc-4.4.0/configure --prefix=${PREFIX} --libdir=${PREFIX}/lib --includedir=${PREFIX}/include --host=${TARGET} --target=${TARGET} --enable-languages=c,c++ --with-sysroot=${SYSROOT} --with-arch=armv5te --with-float=hard --enable-__cxa_atexit --enable-threads=posix --enable-symvers=gnu --enable-c99 --enable-long-long --enable-target-optspace 2>&1 | tee configure.out
make 2>&1 | tee make.out
make install 2>&1 | tee -a make.out
cd ../..
build_7.sh:
Código:
#!/bin/bash
# Setup
PREFIX=/home/fernando/Desktop/prebuilt-toolchain/new/
TARGET=arm-unknown-linux-gnu
SYSROOT=${PREFIX}
export ARCH=arm
export CROSS_COMPILE=${TARGET}-
export PATH=$PATH:${PREFIX}/bin
export INCLUDE=${PREFIX}/include:$INCLUDE
export LD_LIBRARY_PATH=${PREFIX}/lib:$LD_LIBRARY_PATH
# Linux kernel
cd ${PREFIX}/src/linux
make zImage
make modules
make INSTALL_MOD_PATH=${SYSROOT} modules_install
Notas: si pones sysroot!=prefix tendras luego que copiar de sysroot a prefix.
Los ejecutas en orden como usuario normal (no como root) y debería funcionarte sin problemas.
Si deseas más lenguajes a parte de c y c++, indicalo en el guión build_6.sh en la opción --enable-languages=c,c++,<lenguaje1>,... por ejemplo, para ada, fortran, c, c++ y java, "--enable-languages=c,c++,ada,fortran,java".
Espero que esto te sirva de utilidad.
EDITO: La Wiz no tiene soporte VFP, así que no hay razón para no usar la toolchain que hay para descargar aquí.
Marcadores