构buildARM GNU交叉编译器

类似(较less描述)的职位在这里 。

我试图用Ubuntu上的最新版本推出我自己的工具链,并希望在这里有足够的Linux社区,以便在出现某些问题时能获得具体的build议。

在每个人的帮助下,我希望最终能够看到这一点。

首先几乎所有人都提到的“ Crosstool ”(2006)已经过时了一些,似乎现在正在运载火炬的“ Crosstool-NG ”在我的机器上失败了。 我宁愿debugging过程本身比脚本(这似乎需要我了解过程)。

以下是我到目前为止工作的基本步骤; 目前我被困在试图编译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 

构build步骤

在“新鲜”configuration的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 

欢迎 ,你并不孤单。

故事

我不知道为什么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的虚拟机。)

您应该更加努力地使用crosstool-NG,因为crosstool邮件列表是非常活跃的。 由于了解整个过程是一项艰巨的任务,所以了解如何使用您可能重用的工具,恕我直言,更有趣。

这里是HelenOS arm-32工具链安装脚本,这应该做你想要的东西,只需要很少的摆弄。 我现在在Ubuntu上使用它(我是HelenOS开发人员之一)。 它是由马丁·戴基写的:

 #!/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链接来获取它,只需留下评论。

如果你真的想为自己构建整个工具链:
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的主板作为目标。

我使用buildroot建立了交叉编译Linux的工具链和库。 Buildroot使用轻量级的uclibc C库而不是glibc,所以它可能不适合你的目的。 (以这种方式获得工具链可能不是那么令人兴奋,自己编译它。)

这是一点红鲱鱼。 显然现有系统的工具链与工作GLIBC的交叉编译不需要重新编译GLIBC。 我真的不知道我是如何忽略这个事实的。

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

如果可以的话,我会回到这个帖子,并标记我最终做了什么。

编辑:

结帐这个 。