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

构建步骤

在“全新”配置的 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
4

7 回答 7

7

欢迎,你并不孤单。

故事

我不知道为什么 ARM 交叉编译是一场噩梦。这不是我的意见,让我们看看,其他人怎么说...

构建用于嵌入式系统开发的 gcc / glibc 跨工具链曾经是一个可怕的前景,需要铁的意志,几天甚至几周的努力,大量的 Unix 和 Gnu 知识,有时还愿意采取狡猾的捷径。( http://www.kegel.com/crosstool/ )

我的 ARM 计算机 (GuruPlug) 在 Debian 上运行,所以我只需要一个标准的 G++ 编译器,无需任何调整。

我在笔记本上使用 32 位 Ubuntu。有用于 AVR 交叉编译器甚至 Z80 的 deb 包,但没有用于 ARM - 为什么?好的,我们必须编译一个。我们走吧。工具链的编译过程对我来说有点混乱。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,他在与它打了一个星期后编译工具链也失败了。他现在在运行 Ubuntu 的 VM 上使用这个编译器。)

于 2010-06-22T08:24:39.120 回答
3

你真的应该在使用 crosstool-NG 上付出更多的努力,因为 crosstool 邮件列表非常被动。由于了解整个过程是一项艰巨的任务,因此了解如何使用您可能重复使用的工具更有趣。

于 2010-07-28T13:40:18.083 回答
2

我最近使用 crosstool-ng 为 ARM 构建了一个 GNU 工具链。花了一些试验和错误来确定工具链组件的哪些版本可以很好地协同工作,但我最终让它与以下版本一起工作:

  • 二进制实用程序 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 的板作为目标。

于 2009-08-07T18:52:41.123 回答
2

这是HelenOS arm-32 工具链安装脚本,它应该可以做你想要的,只需很少的摆弄。我现在在 Ubuntu 上使用它(我是 HelenOS 开发人员之一)。它是由 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."

抱歉任何换行,应该很容易修复。如果你想要一个 pastebin 或 http 链接来获取它,只需发表评论。

于 2009-08-07T17:39:13.473 回答
1

我很幸运使用buildroot来构建用于交叉编译 Linux 的工具链和库。Buildroot 使用轻量级 uclibc C 库而不是 glibc,因此它可能不适合您的目的。(并且以这种方式获得工具链可能不会那么令人兴奋并自己编译它。)

于 2009-08-11T19:50:29.813 回答
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

这有点像红鲱鱼。显然,使用工作 GLIBC 交叉编译现有系统的工具链不需要重新编译 GLIBC。老实说,我不知道我是如何忽视这个事实的。

因此,即使我仍然不知道如何交叉编译 GCCGLIBC,因为我只需要 GCC,我将把它标记为已关闭。

如果可以的话,我会回到这篇文章并标记我最终做了什么。

编辑:

结帐这个

于 2009-08-11T19:40:45.277 回答