【问题标题】:Building ARM GNU Cross compiler构建 ARM GNU 交叉编译器
【发布时间】:2009-08-07 15:06:25
【问题描述】:

一个类似(描述较少)的帖子是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

【问题讨论】:

  • 企鹅,企鹅..无处不在! :)
  • 抱歉,我误读了您的问题,我以为您知道目标主机上会存在正确的 libc .. 而您只是在外国架构上进行编译。好吧,至少,你现在有了一个工作的 ARM 工具链 :)

标签: linux cross-compiling gnu-toolchain


【解决方案1】:

欢迎,你并不孤单。

故事

我不知道为什么 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上使用这个编译器。)

【讨论】:

  • 我的特殊挑战是我必须链接一个使用目标上现有库的工具链,并将编译更新版本的内核。在放弃记录方法几周后,我最终让它发挥了作用,所以我知道我做了什么。现在我将这些二进制文件作为 tarball 移动,确保只要在我的主机上安装了 32 位库。
  • 顺便说一下,codesourcery 的销售人员,或者至少是 Carlos,对我了解我的需求非常有帮助。由于这些需求,他们无法“开箱即用”地帮助我;尽管如此,我对他们对潜在客户的服务印象深刻。
【解决方案2】:

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

【讨论】:

  • 同意,我正朝着那个方向前进。但是我已经使用 COTS arm 板三年了,并且有一个令人信服的商业案例来自己制造处理器、内存等。 crosstool-NG ……它提供的东西令人惊叹,但是,它在sys-root 中产生了相当大的足迹。这个练习正在变成一种爱好,我想说“是的,我可以这样做,但为什么要打扰”。
【解决方案3】:

这里是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 链接来获取它,只需发表评论。

【讨论】:

  • 谢谢。我现在正在尝试;在我希望我可以从你的脚本中通过配置行进入我上面尝试的内容之前......没有运气(还)。
  • 你测试过这个吗? Bin utils 无法编译。在编译 BINUTILS 时,我添加了一些“sed”脚本来更改其中一个源文件。见mail-archive.com/bug-binutils@gnu.org/msg06475.html
  • 除了编译 BinUtils 的错误之外,如果您想要一个用于裸机的编译器,这将有效。我需要一个 Linux/GLIBC 工具堆栈。不过还是谢谢。
  • 原来你的回答不是我问的问题,而是我应该问的问题。 (也就是说,我不需要交叉编译的 GLIBC,因为目标上已经存在一个)。
  • @Jamie - 抱歉,我假设你知道这一点(并且只是为不同于主机的架构制作包)。
【解决方案4】:

我最近使用 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 的板作为目标。

【讨论】:

    【解决方案5】:

    如果您真的想为自己构建整个工具链:
    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 配置文件,它对我有用。

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

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

        编辑:

        结帐this。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-13
          • 2018-08-05
          • 2014-09-30
          • 1970-01-01
          • 2013-10-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多