ARM架构的Linux交叉编译

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

Solutions Collecting From Web of "ARM架构的Linux交叉编译"

有两种方法我用于ARM / Linux工具。 最简单的方法是直接下载预建的工具链。
:它只是工作,你可以继续你的项目有趣的部分
Con :你被他们挑选的任何版本的gcc / binutils / libc卡住了

如果后者对您来说很重要,请查看crosstool-ng 。 这个项目是一个类似于Linux内核配置应用程序的配置工具。 设置哪个版本的gcc,binutils,libc(GNU或uCLibc),线程,以及用于构建的Linux内核,以及其余的工具(即下载tar球,配置工具和构建它们)。
:你在配置过程中得到了你所选择的
Con :你在配置过程中得到的是你所选择的

这意味着你对编译器/ binutil / libc及其关联的特性/缺陷/错误的选择承担全部责任。 另外,正如评论中所提到的,在选择binutils,C库等版本时会涉及​​到一些“痛苦”,因为并不是所有的组合都必须一起工作甚至是构建。

一种混合方法可能是从预先构建的工具开始,如果需要,可以通过使用crosstool-ng的自定义解决方案来替换它们。

更新 :答案最初使用CodeSourcery工具作为预建工具链的一个例子。 用于ARM的CodeSourcery工具可以从Mentor Graphics免费下载 ,但现在称为Sourcery CodeBench,必须从Mentor Graphics购买。 其他选项现在包括Linaro以及来自Android,Ubuntu等的分发特定工具。

我使用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,这可能不是那么有用,但是用口香糖对我来说效果不错。

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

我在几个目标上使用了crosstool。 只要你想从头开始构建你的工具链,这是非常棒的。 当然,也有几个预制的手臂工具链,只是谷歌它 – 这里太多提到。

1)在我看来,建立自己的工具链效果最好。 你最终对所有东西都有严格的控制,如果你是嵌入式linux的新手,这是一个很棒的学习经验。

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

如果你的公司会花钱,让他们给你买一个JTAG调试器。
这将节省您吨的时间。 它可以让你轻松地学习,并通过内核启动等步骤。我强烈建议使用Lauterbach jtag产品…他们的工作与吨的目标和软件是跨平台。 他们的支持也很好。

如果你不能得到一个JTAG调试器,你在内核工作,使用虚拟机来做到这一点,用户模式Linux,VMWare ..等等..您的代码将被调试在x86 ..移植到您的手臂目标将是一个不同的故事,但它是一个更便宜的方法来消除一些错误。

如果您正在移植引导程序,请使用uboot。 当然,如果你使用的是参考平台,那么你最好使用它提供的BSP。

我希望有帮助。

Buildroot是我从头开始构建一个基于uClibc的自定义工具链的合适工具。 这是非常可定制的,而不是过分关心你正在运行的分布。

此外,它的许多现有用户(即嵌入式路由器发行版)也针对ARM。

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

  $ emerge crossdev
 $ crossdev -t $ ARCH- $ VENDOR- $ OS- $ LIBC 

其中ARCHarm或者armeb ,VENDOR是unknownsoftfloatOSlinux ,而LIBCgnu或者uclibc

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

这就是Eurotech用于Debian ARM分发的原因。 你会注意到,如果你可以避免的话,他们不建议使用交叉编译器。 编译目标本身往往是得到你知道将会运行的输出的更可靠的方法。