質問

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

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

皆様のご協力をいただき、最終的には参考になるものにしたいと思っています。

最初に "クロスツールほぼ全員が言及している「」は少し時代遅れ (2006 年) であり、「クロスツール-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

ビルドステップ

「新しく」構成された Ubuntu 9.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
役に立ちましたか?

解決 7

これはちょっとした赤ニシンでした。どうやら、動作する GLIBC を使用して既存のシステムのツール チェーンをクロスコンパイルする場合、GLIBC を再コンパイルする必要はありません。正直、どうしてこの事実を無視したのかわかりません。

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

可能であれば、この投稿に戻って、最終的に何をしたかを記録したいと思います。

編集:

チェックアウト これ.

他のヒント

いらっしゃいませ, 、 あなたは一人じゃない。

物語

なぜ 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 上でこのコンパイラを使用しています。)

Crosstool メーリング リストは非常に反応的であるため、crosstool-NG の使用にもっと力を入れる必要がありました。プロセス全体を理解するのは大変な作業なので、再利用できるツールの使用方法を理解することの方が、個人的には興味深いです。

ここにあります ヘレンOS arm-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 リンクを取得したい場合は、コメントを残してください。

本当にツールチェーン全体を自分で構築したい場合は、次のようにします。
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設定ファイルがあります。

最近、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 つを選択して、これを試してみるとよいでしょう。

使って良かったです ビルドルート Linux をクロスコンパイルするためのツールチェーンとライブラリを構築します。Buildroot は glibc ではなく軽量の uclibc C ライブラリを使用するため、目的に合わない可能性があります。(そして、この方法でツールチェーンを取得して自分でコンパイルすることは、あまり面白くないかもしれません。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top