10
votes

Compilateur Cross Bras de construction GNU

Un message SIMILIAR (moins descriptif) est ici .

i ' m Essayant de rouler ma propre chaîne d'outils en utilisant des versions récentes sur Ubuntu et espérait qu'il y avait assez d'une communauté Linux que je pourrais obtenir des conseils spécifiques sur certains problèmes au fur et à mesure de leur arrivée. P>

Avec l'aide de tout le monde J'aimerais voir ce transformation en une référence utile éventuellement. p>

premier off " CrostsoTool "à laquelle presque tout le monde se réfère est un peu (2006) hors de date et" Crosstool-NG " qui semble maintenant transporter la torche échoue sur ma machine. Je préfère déboguer le processus lui-même qu'un script (dont il semblerait nécessite que je comprenne le processus). P>

ci-dessous sont des étapes de base de ce que j'ai travaillé jusqu'à présent; À l'heure actuelle, je suis bloqué en essayant de compiler le premier Pass GCC. P>

où il échoue ... strong> p>

Il manque à l'échec car la bibliothèque Cross compilée contenant "CRTI.O" est manquante: p>

#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


2 commentaires

Pingouins, pingouins .. partout! :)


Désolé, j'ai mal lu votre question, j'ai supposé que vous saviez que le correct libc serait présent sur l'hôte de destination .. Et vous veniez de compiler sur une architecture étrangère. Eh bien, au moins, vous avez maintenant une chaîne d'outils de bras de travail :)


7 Réponses :


1
votes

Si vous voulez vraiment construire une boîte à outils complète pour vous-même:
http://frank.harvard.edu/~coldwell/toolchain/
http: //ftp.snapgear. org / pub / snappgear / outils / bras-Linux / Build-arm-linux-3.4.4

N'oubliez pas que, comme vous devez rechercher une matrice de la Compatibilté de Toolchain Compatibilty ou vous pouvez rencontrer des erreurs de compilation étranges.
de
Si vous avez toujours la possibilité de Crosstool-NG, c'est ce que je travaillais depuis quelques jours:
http://blog.stranadurakov.com/2009/08 / 04 / HOW-TOT-ARM-Linux /
Ici vous trouverez mon fichier de configuration Crosstool-NG, qui avait travaillé pour moi.


0 commentaires

2
votes

Voici le Helenos Bras-32 Script d'installation de Toolchain, cela devrait faire ce que vous voulez avec très peu de fiancés. 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."


5 commentaires

Merci. J'essaye ça maintenant; Avant d'espérer que je pouvais juste dépasser la ligne de configuration de votre script dans ce que j'essayais ci-dessus ... pas de chance (encore).


Avez-vous testé cela? Bin utils ne compile pas. Dans la compilation de Binutils, j'ai ajouté des scripts "SED" pour modifier l'un des fichiers source. Voir Mail-Archive.com/bug-binutils@gnu.org /msg06475.html


Outre l'erreur Compilation de Binutils, cela fonctionne si vous voulez un compilateur pour le métal nu. J'ai besoin d'une pile d'outils Linux / Glibc. Merci quand même.


Il s'avère que votre réponse ne devait pas poser de question que je demandais, mais la question que j'aurais dû demander. (C'est-à-dire que je n'ai pas besoin d'un glibc compilé croisé parce que l'on existe déjà sur la cible).


@Jamie - Désolé, j'ai supposé que vous saviez que vous saviez que (et que vous construisiez simplement à créer des paquets pour une architecture différente de la machine hôte).



2
votes

J'ai récemment construit une boîte à outils GNU pour le bras à l'aide de Crosstool-NG. Il a fallu un peu d'essai et d'erreur pour déterminer quelles versions des composants de la boîte à outils joueraient bien ensemble, mais je l'ai enfin obtenu avec les versions suivantes:

  • Binutils 2.19.1
  • GCC 4.3.2
  • GMP 4.2.2
  • Noyau Linux 2.6.29.1
  • MPFR 2.3.1
  • UCLIBC 0.9.30.1

    Voir si ces travaux pour vous aussi.

    Aussi, OpenWrt dans le cadre de son processus de construction crée une boîte à outils croisée. Vous voudrez peut-être essayer cela, en sélectionnant l'une des planches basées au bras comme une cible, même si vous n'êtes pas intéressé à créer un routeur sans fil.


0 commentaires

-1
votes

C'était un peu de hareng rouge. Apparemment, une chaîne d'outils pour un système existant avec un glibc de travail ne nécessite pas que GLIBC soit recompilée. Honnêtement, je ne sais pas comment j'ai ignoré ce fait.

Alors, même si je ne sais toujours pas comment croiser Compile GCC et glibc, car je n'ai besoin que de GCC, je vais marquer cela comme fermé.

Si je peux, je reviendrai sur ce post et je marque ce que j'ai finalement fait.

EDIT:

Checkout Ce .


0 commentaires

1
votes

J'ai eu bonne chance en utilisant Buildroot pour construire des cuillères à outils et des bibliothèques pour la compilation croisée de Linux. Buildroot utilise la bibliothèque légère UCLIBC C plutôt que GLIBC, elle pourrait donc ne pas fonctionner à vos fonctions. (Et obtenir la boîte à outils de cette façon pourrait ne pas être aussi excitante et la compilation vous-même.)


0 commentaires

7
votes

Bienvenue , vous n'êtes pas seul.

l'histoire

Je ne sais pas pourquoi la compilation croisée des bras est un tel cauchemar. Ce n'est pas mon opinion, voyons, ce que les autres disent ...

Construire une boîte à outils croisée GCC / Glibc Pour une utilisation dans des systèmes embarqués Développement utilisé pour être un effrayant perspective, nécessitant le fer, jours si pas des semaines d'effort, beaucoup d'UNIX et GNU Lore, et parfois la volonté de Prenez des raccourcis dodus. ( http://www.kegel.com/crotool/ )

Mon ordinateur ARM (gouruplug) fonctionne sur Debian, donc j'ai juste besoin d'un compilateur g ++ standard, sans modifier.

J'utilise 32 bits Ubuntu sur mon ordinateur portable. Il y a des packages deb pour AVR Cross-compiler, voire pour Z80, mais aucun pour bras - pourquoi? Ok, nous devons compiler un. Allons-y. Le processus de compilation de la boîte à outils est un peu déroutant pour moi. 14k Lignes Long Makefile, merci.

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

la solution

Enfin, j'ai trouvé une solution hors de la boîte. Je viens de télécharger l'édition lite de ce truc: http://www.codesourcery.com/ sgpp / lite_edition.html et maintenant je suis heureux. Il a un installateur laid, mais cela fonctionne. Ça dit: arrach-nul-linux-gnueabi-g ++ (Sourcery g ++ Lite 2010Q1-202) 4.4.1 , qui est une version g ++ à jour.

(mon ami a un Mac, et il a également échoué à compiler la boîte à outils après avoir combattu avec elle pendant une semaine. Il utilise maintenant ce compilateur sur un VM exécutant Ubuntu.)


2 commentaires

Mon défi particulier est que je dois relier une boîte à outils qui utilise des bibliothèques existantes sur la cible et compilera une version plus récente du noyau. Je fini par avoir au travail, des semaines après avoir abandonné une approche documentée, donc je sais une idée de ce que j'ai fait. Maintenant, je déplace ces fichiers binaires autour de Tarball, en veillant à ce que les bibliothèques 32 bits sont installées sur mon hôte.


Au fait, le personnel des ventes, ou au moins Carlos, à CoDesourcery était extrêmement utile dans ma compréhension de ce que mes besoins étaient. En raison de ces besoins, ils ne pouvaient pas m'aider «sur la boîte»; Néanmoins, j'ai été impressionné par leur service à un client potentiel.



3
votes

Vous auriez vraiment dû mettre plus d'efforts avec Crosstool-NG, car la liste de diffusion de la crossoose est très réactive. Puisque la compréhension de l'ensemble du processus est une tâche énorme, comprendre comment utiliser un outil que vous pourriez réutiliser est plus intéressant.


1 commentaires

D'accord, et je bouge de cette façon. Mais j'utilise des babillards de Cots Arm pendant trois ans et il y a une analyse de rentabilisation convaincante à Fab le processeur, le RAM, etc. Crosstool-NG est ... incroyable pour ce qu'il livre, mais il produit une empreinte assez grande dans le sys-racine . Cet exercice se transforme en passe-temps, un endroit où j'aimerais dire "Ouais, je pourrais le faire, mais pourquoi déranger".