Pregunta

Una similar (menos descriptiva) post es aquí .

Estoy tratando de rodar mi propia cadena de herramientas utilizando las últimas versiones de Ubuntu y estaba esperando que no había suficiente cantidad de una comunidad de Linux aquí que podía obtener consejos específicos sobre ciertos problemas a medida que surgen.

Con la ayuda de todos Me gustaría ver esto a su vez en una referencia útil con el tiempo.

En primer lugar " crosstool " a la que casi todo el mundo se refiere es un poco (2006) fuera de fecha y " crosstool-NG", que parece ser ahora llevar la antorcha falla en mi máquina. Prefiero depurar el proceso mismo de un script (que al parecer requiere que entienda el proceso).

A continuación se presentan los pasos básicos de lo que tengo trabajo hasta la fecha; En la actualidad estoy atascado tratando de compilar el primer pase GCC.

¿Dónde está fallando ...

Está fallando porque la biblioteca cruz compilado que contiene "crti.o" no se encuentra:

# ./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

Construir pasos

En una instalación de Ubuntu 9.04 'recién' configurado, estos son 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

Otros consejos

Bienvenido , que 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 la voluntad de hierro, días si   no semanas de esfuerzo, un montón de Unix y   gnu tradición, y en ocasiones la voluntad de   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 32 bits de Ubuntu en mi cuaderno. Hay paquetes deb para AVR compilador cruzado, o incluso para Z80, pero ninguno para ARM - ¿por qué? OK, tenemos que compilar una. 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 feliz. Tiene un instalador feo, pero funciona. Dice: brazo-ninguno-linux-gnueabi-g ++ (Sourcery G ++ Lite 2010q1-202) 4.4.1 , que es una versión actualizada 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.)

Realmente debería haber puesto más esfuerzo con el uso de crosstool-NG, ya que la lista de correo crosstool es muy reactivo. Desde la comprensión de todo el proceso es una tarea enorme, la comprensión de cómo utilizar una herramienta que es posible reutilizar en mi humilde opinión es más interesante.

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

#!/bin/bash

# Cross-Compiler Toolchain for ${PLATFORM}
#  by Martin Decky <martin@decky.cz>
#
#  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, debe ser fácil de solucionar. Si quieres un enlace de Pastebin o http conseguirlo, simplemente dejar un comentario.

Si realmente quiere construir toda la cadena de herramientas por sí mismo:
http://frank.harvard.edu/~coldwell/toolchain/
http: //ftp.snapgear. org / pub / Snapgear / herramientas / arm-linux / build-brazo-linux-3.4.4
Tome 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 / cómo-a-brazo-Linux /
Aquí encontrará mi archivo de configuración crosstool-ng, que había trabajado para mí.

Recientemente he construido una cadena de herramientas GNU para ARM usando 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

A ver si éstos trabajan para usted también.

Además, OpenWrt como parte de su proceso de construcción crea una cadena de herramientas-compilación cruzada. Es posible que desee para tratar de que, seleccionando una de las placas basadas en ARM como un objetivo, incluso si usted no está interesado en hacer un router inalámbrico.

He tenido buena suerte usando buildroot para construir cadenas de herramientas y bibliotecas para Linux-compilación cruzada. Buildroot utiliza la biblioteca uClibc C ligera en lugar de glibc, por lo que podría no funcionar para sus propósitos. (Y conseguir la cadena de herramientas de esta manera podría no ser tan emocionante y compilar usted mismo.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top