构建ARM GNU交叉编译器

时间:2009-08-07 15:06:26

标签: linux cross-compiling gnu-toolchain

类似(不太具描述性)的帖子是here

我正在尝试使用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

7 个答案:

答案 0 :(得分:7)

欢迎,你并不孤单。

故事

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

  

构建gcc / glibc交叉工具链   用于嵌入式系统   发展曾经是一个可怕的   前景,需要铁的意志,如果   不是几周的努力,很多Unix和   Gnu绝杀,有时也愿意   采取狡猾的捷径。 http://www.kegel.com/crosstool/

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

我在笔记本上使用32位Ubuntu。有AVR交叉编译器的deb包,甚至是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上使用这个编译器。)

答案 1 :(得分:3)

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

答案 2 :(得分: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链接来获取它,只需发表评论。

答案 3 :(得分: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配置文件,它对我有用。

答案 4 :(得分:1)

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

  • binutils 2.19.1
  • gcc 4.3.2
  • gmp 4.2.2
  • linux kernel 2.6.29.1
  • mpfr 2.3.1
  • uClibc 0.9.30.1

看看这些是否适合你。

此外,OpenWrt作为其构建过程的一部分创建了交叉编译工具链。您可能想尝试这样做,选择一个基于ARM的板作为目标,即使您对制作无线路由器不感兴趣。

答案 5 :(得分:1)

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

答案 6 :(得分:-1)

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

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

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

编辑:

结帐this