ARM架构的Linux交叉编译

时间:2009-01-29 20:16:29

标签: linux embedded x86 arm

我有兴趣在x86主机上为ARM目标交叉编译Linux内核。你推荐一些好的做法吗?您认为哪个是最好的交叉编译套件? 您是否已经确定了自定义交叉编译环境?如果是,您有什么建议?这是个好主意吗?

7 个答案:

答案 0 :(得分:30)

我用过ARM / Linux工具有两种方法。最简单的方法是直接下载预制的工具链 专业:它只是有效,您可以继续处理项目中有趣的部分 Con :您对他们选择的gcc / binutils / libc版本感到困惑

如果后者对您很重要,请查看crosstool-ng。该项目是一个类似于Linux内核配置应用程序的配置工具。设置要构建的gcc,binutils,libc(GNU或uCLibc),线程和Linux内核的哪些版本以及crosstool-ng完成剩下的工作(即下载tar球,配置工具并构建它们)。
Pro :您可以获得在配置期间选择的内容 Con :您可以获得在配置期间选择的内容

意味着您对选择compiler / binutil / libc及其相关功能/缺点/错误承担全部责任。另外,正如评论中所提到的,选择binutils,C库等版本时会有一些“痛苦”,因为并非所有组合都必须协同工作甚至构建。

一种混合方法可能是从预先构建的工具开始,然后在必要时通过crosstool-ng替换它们。

更新:答案最初使用CodeSourcery tools作为预建工具链的示例。 ARM的CodeSourcery工具可以免费download from Mentor Graphics,但它们现在称为Sourcery CodeBench,必须从Mentor Graphics购买。其他选项现在包括Linaro以及来自Android,Ubuntu和其他人的分发特定工具。

答案 1 :(得分:7)

我使用emdebian工具链来编译我的ARM机器的东西,这些东西不太乐意在可用的小资源中本地编译(/我对内核瞪眼)。主包是gcc-4.X-arm-linux-gnueabi(X = 1,2,3),并提供适当的后缀gcc / cpp / ld / etc命令。我将此添加到sources.list

deb http://www.emdebian.org/debian/ unstable main

当然,如果你没有使用Debian,这可能不是那么有用,但是通过 gum 它对我来说效果很好。

答案 2 :(得分:6)

我在尝试为使用ARM处理器的maemo(诺基亚N810)构建应用程序时使用了scratchbox。据推测,scratchbox不仅限于maemo开发。

答案 3 :(得分:6)

我在几个目标上使用过crosstool。只要您想从头开始构建工具链,它就很棒。 当然还有几个预先建立的手臂工具链,只是google它 - 这里有太多不能提及。

1)在我看来,构建自己的工具链是最好的。您最终可以严格控制所有内容,此外,如果您是嵌入式Linux的新手,那么这将是一次很棒的学习体验。

2)不要使用商业工具链。即使你不想花时间建立自己的,也有免费的选择。

如果贵公司会花钱,让他们给你买一个jtag调试器。
它将为您节省大量时间。它可以让您轻松学习并逐步完成内核启动等。 我强烈建议使用Lauterbach jtag产品......他们使用大量目标,软件是跨平台的。他们的支持也很棒。

如果您无法获得jtag调试器并且您正在使用内核,请使用VM来执行此操作,usermode linux,vmware..etc ..您的代码将在x86上调试..将其移植到您的手臂目标将是一个不同的故事,但它是一个更便宜的方法来消除一些错误。

如果要移植引导加载程序,请使用uboot。当然,如果您使用的是参考平台,那么您可能最好使用它们为BSP提供的功能。

我希望有所帮助。

答案 4 :(得分:5)

Buildroot是一个工具,我从头开始构建一个基于uClibc的自定义工具链。它非常可定制,并且对于您正在运行的发行版并不过分具体。

此外,它的许多现有用户(即嵌入式路由器发行版)也都以ARM为目标。

答案 5 :(得分:3)

如果您使用的是Gentoo,那么获得交叉编译工具链就像

一样简单
$ emerge crossdev
$ crossdev -t $ARCH-$VENDOR-$OS-$LIBC

其中ARCHarmarmeb,供应商为unknownsoftfloatOSlinux,{ {1}}是LIBCgnu

如果你想要的只是内核的编译器(和链接器),uclibc部分是无关紧要的,你可以使用LIBC / -s1通知--stage1您只需要crossdevbinutils

答案 6 :(得分:0)

This is what Eurotech uses用于他们的Debian ARM distibution。您会注意到,如果您可以避免使用交叉编译器,则不建议使用它们。编译目标本身往往是一种更可靠的方式来获取你知道会运行的输出。