Question

A similaire (moins descriptif) poste est .

Je suis en train de rouler ma propre chaîne d'outils utilisant les versions récentes sur Ubuntu et espérais qu'il y avait assez d'une communauté Linux ici que je pourrais obtenir des conseils spécifiques sur certains problèmes comme ils viennent.

Avec l'aide de tout le monde que je voudrais voir ce tour dans une référence utile par la suite.

Tout d'abord « Crosstool » auquel presque tout le monde fait référence est un peu (2006) sur la date et « Crosstool-NG » qui semble être porteur maintenant le flambeau échoue sur ma machine. Je préfère déboguer le processus lui-même qu'un script (ce qui semble me oblige à comprendre le processus).

Voici les étapes de base de ce que j'ai travailler jusqu'à présent; à l'heure actuelle, je suis coincé essayer de compiler la première GCC passe.

où il est ... à défaut

Il est un échec parce que la bibliothèque de croix compilé contenant « crti.o » est manquante:

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

Construire étapes

Sur un « fraîchement » configuré l'installation d'Ubuntu 9.04, voici les étapes que je l'ai fait jusqu'à présent:

#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
Était-ce utile?

La solution 7

Ce fut un peu de rouge-hareng. Apparemment, cross-compling une chaîne d'outils pour un système existant avec un GLIBC travail ne nécessite pas GLIBC recompilation. Honnêtement, je ne sais pas comment je l'ai ignoré ce fait.

Alors, même si je ne sais toujours pas comment une compilation croisée GCC et GLIBC, comme je l'ai seulement besoin du CCG je vais marquer cela comme fermé.

Si je peux, je vais revenir à ce poste et marquer ce que je l'ai fait par la suite.

EDIT:

Commander ce .

Autres conseils

Bienvenue , vous n'êtes pas seul.

L'histoire

Je ne sais pas pourquoi ARM cross-compilation est un tel cauchemar. Ce n'est pas mon avis, nous allons voir ce que les autres disent ...

  

Construire une gcc / glibc cross-toolchain   pour une utilisation dans les systèmes embarqués   le développement était autrefois un effrayant   perspective, ce qui nécessite une volonté de fer, jours si   pas des semaines d'effort, beaucoup d'Unix et   lore Gnu, et parfois la volonté de   prendre des raccourcis louches. ( http://www.kegel.com/crosstool/ )

Mon ordinateur ARM (GuruPlug) est en cours d'exécution sur Debian, donc j'ai juste besoin d'une norme G ++ compilateur, sans quelques réglages.

J'utilise Ubuntu 32 bits sur mon ordinateur portable. Il y a des paquets deb pour compilateur croisé AVR, ou même pour Z80, mais aucun pour ARM - pourquoi? OK, nous devons compiler un. Allons-y. Le processus de compilation de l'ensemble des outils est un peu déroutant pour moi. 14k lignes Makefile longue, je vous remercie.

Après quelques jours (et nuits) j'ai échoué.

La solution

Enfin, je l'ai trouvé un hors de la boîte soluion. Je viens de télécharger l'édition allégée de ce genre de choses: http://www.codesourcery.com/ PPGB / lite_edition.html et maintenant je suis heureux. Il a un programme d'installation laid, mais cela fonctionne. Ça dit: bras-linux-none-gnueabi-g ++ (Sourcery G ++ Lite 2010q1-202) 4.4.1 , qui est une mise à jour version G ++.

(Mon ami a un Mac, et il a échoué la compilation du toolchain après avoir combattu avec elle pendant une semaine. Il utilise maintenant ce compilateur sur Ubuntu VM en cours d'exécution.)

Vous devriez vraiment avoir plus d'efforts à l'utilisation crosstool-NG, puisque la liste de diffusion de crosstool est très réactif. Étant donné que la compréhension du processus est une tâche énorme, comprendre comment utiliser un outil que vous pouvez réutiliser est à mon humble avis plus intéressant.

Voici le bras 32 script d'installation toolchain HELENOS, cela devrait faire ce que vous voulez avec très peu de tripotage. Je l'utilise sur Ubuntu maintenant (je suis l'un des développeurs HELENOS). Il a été écrit par 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."

Désolé pour tout emballage en ligne, devrait être facile à corriger. Si vous voulez un lien pastebin ou http pour l'obtenir, il suffit de laisser un commentaire.

Si vous êtes vraiment voulez construire toolchain ensemble pour vous-même:
http://frank.harvard.edu/~coldwell/toolchain/
http: //ftp.snapgear. org / pub / SnapGear / tools / bras-linux / build-bras-linux-3.4.4
Prenez à l'esprit, cependant, que vous devez rechercher matrice de toolchain ou vous pouvez compatibilty exécuter dans des erreurs de compilation étranges.

Si vous avez toujours la possibilité pour crosstool-ng, c'est ce que je travaillais pendant ces derniers jours:
http://blog.stranadurakov.com/2009/08 / 04 / how-bras à linux /
Vous trouverez ici mon fichier de configuration crosstool-ng, qui avait travaillé pour moi.

J'ai récemment construit un ensemble d'outils GNU pour ARM en utilisant crosstool-ng. Il a fallu un peu d'essais et d'erreurs pour déterminer quelles versions des composants de l'ensemble des outils joueraient bien ensemble, mais je l'ai finalement obtenu de travailler avec les versions suivantes:

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

Voyez si ces travaux pour vous aussi.

En outre, OpenWrt comme partie Construisons processus crée une chaîne d'outils de compilation croisée. Vous voudrez peut-être essayer, sélectionner l'une des cartes à base d'ARM comme cible, même si vous n'êtes pas intéressé à faire un routeur sans fil.

J'ai eu une bonne chance en utilisant buildroot pour construire toolchains et bibliothèques pour Linux compilation croisée. Buildroot utilise la bibliothèque légère uclibc C plutôt que glibc, il peut ne pas fonctionner à vos besoins. (Et obtenir le toolchain cette façon pourrait ne pas être aussi passionnant et le compiler vous-même.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top