10

同様の(あまり説明的でない)投稿はここにあります。

私はUbuntuの最近のリリースを使用して独自のツールチェーンを展開しようとしていますが、特定の問題が発生したときに具体的なアドバイスを得ることができる十分なLinuxコミュニティがここにあることを望んでいました。

皆さんの助けを借りて、これが最終的には有用なリファレンスになることを望んでいます。

まず、ほとんどの人が言及している「Crosstool」は少し(2006年)古くなっており、現在トーチを運んでいるように見える「Crosstool-NG」は私のマシンで失敗します。スクリプトよりもプロセス自体をデバッグしたい(プロセスを理解する必要があるように思われる)。

以下は、私がこれまでに取り組んできた基本的な手順です。現在、最初のパスのGCCをコンパイルしようとして立ち往生しています。

失敗しているところ...

「crti.o」を含むクロスコンパイルされたライブラリが欠落しているため、失敗しています。

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

ビルド手順

「新しく」構成されたUbuntu9.04のインストールで、これまでに行った手順は次のとおりです。

#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
4

7 に答える 7

7

ようこそ、あなたは一人ではありません。

物語

ARMのクロスコンパイルがなぜそんなに悪夢なのかわかりません。それは私の意見ではありません、見てみましょう、他の人が言うこと...

組み込みシステム開発で使用するためのgcc/glibcクロスツールチェーンを構築することは、以前は恐ろしい見通しでした。鉄の意志、数週間ではないにしても数日、多くのUnixとGnuの伝承、そして時には危険なショートカットをとる意欲が必要でした。http://www.kegel.com/crosstool/

私のARMコンピューター(GuruPlug)はDebianで実行されているので、調整なしで標準のG++コンパイラーが必要です。

ノートブックで32ビットのUbuntuを使用しています。AVRクロスコンパイラーまたはZ80用のdebパッケージがありますが、ARM用にはありません-なぜですか?OK、コンパイルする必要があります。さあ行こう。ツールチェーンのコンパイルプロセスは私にとって少し混乱しています。14k行のMakefile、ありがとうございます。

数日(そして夜)後、私は失敗しました。

ソリューション

最後に、すぐに使えるソリューションを見つけました。私はこのようなもののライト版をダウンロードしました:http://www.codesourcery.com/sgpp/lite_edition.htmlそして今私は幸せです。醜いインストーラーがありますが、動作します。それは言う: arm-none-linux-gnueabi-g ++(Sourcery G ++ Lite 2010q1-202)4.4.1、これは最新のG++バージョンです。

(私の友人はMacを持っていて、1週間それと戦った後、ツールチェーンのコンパイルにも失敗しました。彼は現在、Ubuntuを実行しているVMでこのコンパイラを使用しています。)

于 2010-06-22T08:24:39.120 に答える
3

crosstoolメーリングリストは非常に反応が良いので、crosstool-NGの使用にはもっと力を入れるべきでした。プロセス全体を理解することは大きな課題であるため、再利用できるツールの使用方法を理解することは、私見の方が興味深いことです。

于 2010-07-28T13:40:18.083 に答える
2

これがHelenOSarm -32ツールチェーンのインストールスクリプトです。これはごくわずかな手間であなたが望むことをするはずです。私は現在Ubuntuで使用しています(私はHelenOS開発者の1人です)。それはマーティンデッキーによって書かれました:

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

行の折り返しについては申し訳ありませんが、簡単に修正できるはずです。ペーストビンまたはhttpリンクで取得したい場合は、コメントを残してください。

于 2009-08-07T17:39:13.473 に答える
2

私は最近、crosstool-ngを使用してARM用のGNUツールチェーンを構築しました。ツールチェーンコンポーネントのどのバージョンが一緒にうまく機能するかを理解するのに少し試行錯誤が必要でしたが、最終的に次のバージョンで動作するようになりました。

  • binutils 2.19.1
  • gcc 4.3.2
  • gmp 4.2.2
  • Linuxカーネル2.6.29.1
  • mpfr 2.3.1
  • uClibc 0.9.30.1

これらがあなたにも役立つかどうかを確認してください。

また、ビルドプロセスの一部としてのOpenWrtは、クロスコンパイルツールチェーンを作成します。ワイヤレスルーターの作成に興味がない場合でも、ターゲットとしてARMベースのボードの1つを選択して試してみることをお勧めします。

于 2009-08-07T18:52:41.123 に答える
1

ツールチェーン全体を自分で構築したい場合:http:
//frank.harvard.edu/~coldwell/toolchain/
http://ftp.snapgear.org/pub/snapgear/tools/arm-linux/build- arm-linux-3.4.4
ただし、ツールチェーンの互換性マトリックスを検索する必要があるため、注意してください。そうしないと、奇妙なコンパイルエラーが発生する可能性があります。

crosstool-ngのオプションがまだある場合は、これが私がここ数日間取り組んでいたことです:http:
//blog.stranadurakov.com/2009/08/04/how-to-arm-linux/
ここにあなたは私のために働いていた私のcrosstool-ng設定ファイルを見つけるでしょう。

于 2009-08-07T15:20:41.127 に答える
1

Linuxをクロスコンパイルするためのツールチェーンとライブラリを構築するためにbuildrootを使用して幸運に恵まれました。Buildrootは、glibcではなく軽量のuclibc Cライブラリを使用するため、目的に合わない場合があります。(そして、この方法でツールチェーンを取得することは、それほどエキサイティングでなく、自分でコンパイルすることではないかもしれません。)

于 2009-08-11T19:50:29.813 に答える
-1

これは少し赤ニシンでした。明らかに、GLIBCが機能している既存のシステムのツールチェーンをクロスコンプリートするために、GLIBCを再コンパイルする必要はありません。正直、この事実をどうやって無視したのかわかりません。

したがって、GCCとGLIBCをクロスコンパイルする方法はまだわかりませんが、必要なのはGCCだけなので、これをクローズとしてマークします。

可能であれば、この投稿に戻って、最終的に何をしたかをマークします。

編集:

これをチェックしてください。

于 2009-08-11T19:40:45.277 に答える