2009-08-07 21 views
10

Una publicación similar (menos descriptiva) es here.Building ARM compilador cruzado GNU

Estoy tratando de hacer rodar mi propia cadena de herramientas usando lanzamientos recientes en Ubuntu y esperaba que hubiera suficiente comunidad Linux aquí que pudiera obtener consejos específicos sobre ciertos problemas a medida que surgen.

Con la ayuda de todos, me gustaría ver que este se convierta finalmente en una referencia útil.

En primer lugar, "Crosstool" al que casi todo el mundo se refiere es un poco (2006) desactualizado y "Crosstool-NG" que parece estar cargando con la antorcha en mi máquina. Prefiero depurar el proceso en sí mismo que un script (lo que parece requerir que entienda el proceso).

A continuación se muestran los pasos básicos de lo que he estado trabajando hasta ahora; en este momento estoy atascado tratando de compilar el primer pase GCC.

Dónde está fallando ...

está fallando porque la cruz compilada biblioteca que contiene "crti.o" desaparece:

# ./gcc-4.4.1/configure --target=arm-linux --disable-thread --enable-langauges=c 
/bin/bash ../../../gcc-4.4.1/libgcc/../mkinstalldirs . 
/usr/src/gnu-4.4.1-build/./gcc/xgcc -B ........ 
/usr/local/arm-linux/bin/ld: crti.o No such file: No such file or directory 
collect2: ld returned 1 exit status 
make[2]: *** [libgcc_s.so] Error 1 
make[2]: Leaving directory `/usr/src/gnu/gcc-4.4.1-build/arm-linux/libgcc' 
make[1]: *** [all-target-libgcc] Error 2 
make[1]: Leaving directory `/usr/src/gnu/gcc-4.4.1-build' 
make: *** [all] Error 2 

etapas de la generación

En una instalación "recién configurada" de Ubuntu 9.04, aquí están los pasos que he hecho hasta ahora:

#New configuration of Ubuntu 9.04 
sudo updatedb 
sudo apt-get install build-essential subversion 
# For kernel configuration 
sudo apt-get install libncurses5-dev 
# For building GCC 
sudo apt-get install libgmp3-dev libmpfr-dev 

#Get Linux Headers for GCC/GLIBC compilations 
# I use a hacked Linux from Artilla, 
pushd ~ && svn co http://.../linux m501-linux && cd !$ 
make ARCH=arm m501_defconfig 
make ARCH=arm menuconfig 
sudo mkdir /usr/local/arm-linux/include 
sudo cp -dR include/asm-arm /usr/local/arm-linux/include/asm 
sudo cp -dR include/linux /usr/local/arm-linux/include/linux 
cd /usr/local/arm-linux/ 
sudo ln -s include sys-include 
popd 

#Get sources: 
cd /usr/src/ 
sudo su root 
mkdir gnu 
ftp ftp.gnu.org 
# get gnu/binutils/binutils-2.19.1.tar.bz2 
# get gnu/gcc/gcc-4.4.1/gcc-4.4.1.tar.bz2 
# get gnu/glibc/glibc-2.10.1.tar.bz2 
# get gnu/gdb/gdb-6.8.tar.bz2 

#Build Binutils 
bzcat binutils-2.19.1.tar.bz2 | tar -xv 
mkdir binutils-2.19.1-build && cd !$ 
cp ../binutils-2.19.1/gas/config/tc-arm.c ./tc-arm.c 
sed -r 's/(as_bad[ \t]*\()(.+\[.+\]\))/\1\"%s\",\2/' < ./tc-arm.c > ../binutils-2.19.1/gas/config/tc-arm.c 
rm ./tc-arm.c  
../binutils-2.19.1/configure --target=arm-linux 
make && make install && cd .. 

#Build GCC 
bzcat gcc-4.4.1.tar.bz2 | tar -xv 
mkdir gcc-4.4.1-build && cd !$ 
../gcc-4.4.1/configure --target=arm-linux --disable-thread --enable-langauges=c -with-headers=/usr/local/arm-linux/include 
make 
+0

Pingüinos, pingüinos ... ¡a todos lados! :) –

+0

Lo siento, he leído mal tu pregunta, supuse que sabías que la libc correcta estaría presente en el host de destino ... y que solo estabas compilando en una arquitectura extranjera. Bueno, al menos, ahora tienes una cadena de herramientas ARM en funcionamiento :) –

Respuesta

-1

Esto fue un poco atrevido. Al parecer, la compilación cruzada de una cadena de herramientas para un sistema existente con un GLIBC en funcionamiento no requiere la recompilación de GLIBC. Honestamente, no sé cómo ignoré este hecho.

Así que, aunque todavía no sé cómo cruzar compilar GCC y GLIBC, como solo necesito GCC voy a marcar esto como cerrado.

Si puedo, volveré a esta publicación y marcaré lo que finalmente hice.

EDIT:

Pedido this.

1

Si realmente quiere construir toda la cadena de herramientas por sí mismo:
http://frank.harvard.edu/~coldwell/toolchain/
http://ftp.snapgear.org/pub/snapgear/tools/arm-linux/build-arm-linux-3.4.4
Toma en cuenta, sin embargo, como usted debe buscar matriz compatibilty cadena de herramientas o es posible que encuentre errores de compilación extraños.

Si todavía tiene la opción de crosstool-ng, esto es lo que estoy estaba trabajando para los últimos días:
http://blog.stranadurakov.com/2009/08/04/how-to-arm-linux/
Aquí encontrará mi archivo de configuración crosstool-ng, que había trabajado para mí .

2

Aquí está el script de instalación de toolchain de brazo-32 HelenOS, esto debería hacer lo que quiera con muy poco toquetear. Lo estoy usando en Ubuntu ahora (soy uno de los desarrolladores de HelenOS). Fue escrito por Martin Decky:

#!/bin/bash 

# Cross-Compiler Toolchain for ${PLATFORM} 
# by Martin Decky <[email protected]> 
# 
# GPL'ed, copyleft 
# 


check_error() { 
    if [ "$1" -ne "0" ]; then 
     echo 
     echo "Script failed: $2" 
     exit 
    fi 
} 

if [ -z "${CROSS_PREFIX}" ] ; then 
    CROSS_PREFIX="/usr/local" 
fi 

BINUTILS_VERSION="2.19.1" 
GCC_VERSION="4.3.3" 

BINUTILS="binutils-${BINUTILS_VERSION}.tar.gz" 
GCC_CORE="gcc-core-${GCC_VERSION}.tar.bz2" 
GCC_OBJC="gcc-objc-${GCC_VERSION}.tar.bz2" 
GCC_CPP="gcc-g++-${GCC_VERSION}.tar.bz2" 

BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/" 
GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/" 

PLATFORM="arm" 
WORKDIR=`pwd` 
TARGET="${PLATFORM}-linux-gnu" 
PREFIX="${CROSS_PREFIX}/${PLATFORM}" 
BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}" 
GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}" 
OBJDIR="${WORKDIR}/gcc-obj" 

echo ">>> Downloading tarballs" 

if [ ! -f "${BINUTILS}" ]; then 
    wget -c "${BINUTILS_SOURCE}${BINUTILS}" 
    check_error $? "Error downloading binutils." 
fi 
if [ ! -f "${GCC_CORE}" ]; then 
    wget -c "${GCC_SOURCE}${GCC_CORE}" 
    check_error $? "Error downloading GCC Core." 
fi 
if [ ! -f "${GCC_OBJC}" ]; then 
    wget -c "${GCC_SOURCE}${GCC_OBJC}" 
    check_error $? "Error downloading GCC Objective C." 
fi 
if [ ! -f "${GCC_CPP}" ]; then 
    wget -c "${GCC_SOURCE}${GCC_CPP}" 
    check_error $? "Error downloading GCC C++." 
fi 

echo ">>> Creating destionation directory" 
if [ ! -d "${PREFIX}" ]; then 
    mkdir -p "${PREFIX}" 
    test -d "${PREFIX}" 
    check_error $? "Unable to create ${PREFIX}." 
fi 

echo ">>> Creating GCC work directory" 
if [ ! -d "${OBJDIR}" ]; then 
    mkdir -p "${OBJDIR}" 
    test -d "${OBJDIR}" 
    check_error $? "Unable to create ${OBJDIR}." 
fi 

echo ">>> Unpacking tarballs" 
tar -xvzf "${BINUTILS}" 
check_error $? "Error unpacking binutils." 
tar -xvjf "${GCC_CORE}" 
check_error $? "Error unpacking GCC Core." 
tar -xvjf "${GCC_OBJC}" 
check_error $? "Error unpacking GCC Objective C." 
tar -xvjf "${GCC_CPP}" 
check_error $? "Error unpacking GCC C++." 

echo ">>> Compiling and installing binutils" 
cd "${BINUTILSDIR}" 
check_error $? "Change directory failed." 
./configure "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" "--disable-nls" 
check_error $? "Error configuring binutils." 
make all install 
check_error $? "Error compiling/installing binutils." 

echo ">>> Compiling and installing GCC" 
cd "${OBJDIR}" 
check_error $? "Change directory failed." 
"${GCCDIR}/configure" "--target=${TARGET}" "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" --with-gnu-as --with-gnu-ld --disable-nls --disable-threads --enable-languages=c,objc,c++,obj-c++ --disable-multilib --disable-libgcj --without-headers --disable-shared 
check_error $? "Error configuring GCC." 
PATH="${PATH}:${PREFIX}/bin" make all-gcc install-gcc 
check_error $? "Error compiling/installing GCC." 

echo 
echo ">>> Cross-compiler for ${TARGET} installed." 

Lo siento por cualquier ajuste de línea, debería ser fácil de arreglar. Si desea un enlace pastebin o http para obtenerlo, simplemente deje un comentario.

+0

Gracias. Lo estoy intentando ahora; antes, esperaba poder pasar la línea de configuración de tu script a lo que estaba intentando arriba ... sin suerte (todavía). – Jamie

+0

¿Has probado esto? Bin utils no compila. En la compilación de BINUTILS, agregué algunos scripts "sed" para cambiar uno de los archivos fuente. vea http://www.mail-archive.com/[email protected]/msg06475.html – Jamie

+1

Aparte del error que compila BinUtils, esto funciona si usted quiere un compilador para el metal desnudo. Necesito una pila de herramientas Linux/GLIBC. Gracias sin embargo. – Jamie

1

Hace poco construí una cadena de herramientas de GNU para ARM utilizando crosstool-ng. Tomó un poco de ensayo y error para averiguar qué versiones de los componentes de la cadena de herramientas jugarían bien juntos, pero finalmente lo consiguió trabajando con las siguientes versiones:

  • binutils 2.19.1
  • gcc 4.3.2
  • gmp 4.2.2
  • linux kernel 2.6.29.1
  • MPFR 2.3.1
  • uClibc 0.9.30.1

ver si estos trabajos para usted también.

Además, OpenWrt como parte de su proceso de creación crea una cadena de herramientas de compilación cruzada. Es posible que desee intentar eso, seleccionando uno de los tableros basados ​​en ARM como un objetivo, incluso si no está interesado en hacer un enrutador inalámbrico.

1

He tenido buena suerte usando buildroot para construir toolchains y bibliotecas para la compilación cruzada de Linux. Buildroot usa la liviana biblioteca C de uclibc en lugar de glibc, por lo que podría no funcionar para sus propósitos. (Y obtener la cadena de herramientas de esta manera puede no ser tan emocionante y compilarla usted mismo.)

7

Bienvenido, usted no está solo.

La historia

No sé qué ARM compilación cruzada es una pesadilla. No es mi opinión, vamos a ver, lo que otros dicen ...

La construcción de un gcc/glibc cruzada cadena de herramientas para su uso en sistemas embebidos desarrollo solía ser un miedo perspectiva, lo que requiere voluntad de hierro, días si no semanas de esfuerzo, mucho de Unix y Gnu saber ya veces disposición a tomar atajos poco fiables. (http://www.kegel.com/crosstool/)

Mi equipo ARM (guruplug) funciona en Debian, por lo que sólo necesita un estándar compilador G ++, sin ningún ajuste.

Estoy usando Ubuntu de 32 bits en mi notebook. Hay paquetes deb para compilador cruzado AVR, o incluso para Z80, pero ninguno para ARM, ¿por qué? OK, tenemos que compilar uno. Vamonos. El proceso de compilación de la cadena de herramientas es un poco confuso para mí. 14k líneas de largo Makefile, gracias.

Después de algunos días (y noches) he fallado.

La solución

Por último, he encontrado un soluion fuera de la caja. Acabo de descargar la edición lite de estas cosas: http://www.codesourcery.com/sgpp/lite_edition.html y ahora estoy contento. Tiene un instalador feo, pero funciona.Dice: arm-none-linux-gnueabi-g ++ (Sourcery G ++ Lite 2010q1-202) 4.4.1, que es una versión actualizada de G ++.

(Mi amigo tiene un Mac, y también ha fallado la compilación de la cadena de herramientas después de luchar con ella durante una semana. Ahora se está utilizando este compilador en una máquina virtual con Ubuntu.)

+0

Mi desafío particular es que tengo que vincular una cadena de herramientas que usa bibliotecas existentes en el destino, y compilaré una versión más reciente del Kernel. Finalmente logré que funcionara, semanas después de abandonar un enfoque documentado, así que sé lo que hice. Ahora muevo esos binarios como un tarball, asegurándome de que las bibliotecas de 32 bits estén instaladas en mi host. – Jamie

+0

Por cierto, el personal de ventas, o al menos Carlos, en codestore fue inmensamente útil en mi comprensión de cuáles eran mis necesidades. Debido a esas necesidades, no podían ayudarme a salir de la caja; sin embargo, quedé impresionado con su servicio solo para un posible cliente. – Jamie

3

realmente debería haber puesto más esfuerzo con el uso de crosstool-NG, ya que la lista de correo crosstool es muy reactiva. Como entender todo el proceso es una tarea enorme, entender en mi humilde opinión cómo usar una herramienta que puede volver a utilizar es en mi humilde opinión más interesante.

+0

De acuerdo, y me estoy moviendo de esa manera. Pero he estado utilizando los tableros de brazo COTS durante tres años, y existe un convincente caso comercial para fabricar el procesador, ram, etc. crosstool-NG es ... increíble por lo que ofrece, pero está produciendo una huella bastante grande en el 'sys-root'. Este ejercicio se está convirtiendo en un hobby, uno en el que me gustaría decir "sí, podría hacerlo, pero ¿para qué molestarse?". – Jamie