Linux交叉编译针对ARM架构

20

我对在x86主机上为ARM目标交叉编译Linux内核感兴趣。你有什么好的实践建议?在你看来,哪个是最好的交叉编译套件?

如果您已经设置了自定义的交叉编译环境,请问您有何建议?这是一个好主意吗?


原住民 Linux 怎么样? - jacktrades
7个回答

30
有两种方法可用于ARM/Linux工具。最简单的方法是直接下载预构建的工具链。
优点: 它可以直接使用,您可以开始进行项目的有趣部分
缺点: 您将被困在他们选择的gcc/binutils/libc版本中。
如果后者对您很重要,请查看crosstool-ng。该项目类似于Linux内核配置应用程序的配置工具。设置要构建的gcc、binutils、libc(GNU或uCLibc)、线程和Linux内核的版本,crosstool-ng会完成其余部分(即下载tar包、配置工具并构建它们)
优点: 您可以获得您在配置期间选择的内容
缺点: 您可以获得您在配置期间选择的内容,这意味着您需要对编译器/binutil/libc及其相关功能/缺陷/错误负起全部责任。此外,正如评论中提到的那样,选择binutils、C库等版本存在一定的“痛苦”,因为并不是所有组合都能够一起工作或构建。
一种混合方法可能是从预构建的工具开始,如果必要,稍后再用crosstool-ng替换为自定义解决方案。 更新:该答案最初使用CodeSourcery工具作为预构建工具链的示例。ARM的CodeSourcery工具可从Mentor Graphics 下载, 但现在称为Sourcery CodeBench,并必须从Mentor Graphics购买。现在的其他选项包括Linaro以及来自Android、Ubuntu和其他发行版特定的工具。

2
crosstool-ng 的另一个缺点是你必须自己找出哪些 gcc/glibc/target 架构版本的组合是可行的,哪些是不可行的。(好吧,你可以在 crosstool-ng 主页上的“已知可用”列表中查找,但如果你喜欢的组合不在列表中,你就需要自己找出它是否可行。 - mmmmmmmm
1
这是正确的,但从一个工作配置开始会使事情变得更容易。如果您必须为Windows和/或其他操作系统制作加拿大十字工具,则预构建的工具可能永远不适合。使用ct-ng肯定需要几周时间,而不是几分钟。然而,代码生成通常比预构建的更好,如果需要,可以获得最新的功能(LTO,C++0x,C++11等)。 - artless noise
1
Sourcery CodeBench(Lite)已经不再支持ARM!但是它仍然适用于其他目标...看起来Mentor Graphics希望我们购买专有版本的Sourcery CodeBench。 - 71GA

7

我使用emdebian工具链为我的ARM机器编译一些不适合在有限资源下本地编译的东西(/me瞪着内核)。主要包是gcc-4.X-arm-linux-gnueabi(X = 1,2,3),提供了相应后缀的gcc/cpp/ld等命令。我将其添加到我的sources.list中:

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

当然,如果您没有使用Debian,这可能并不太有用,但通过咀嚼胶,它对我很有效。

6

我在为Maemo(Nokia N810)构建应用程序时使用了Scratchbox,它使用ARM处理器。据说,Scratchbox不仅适用于Maemo开发。


6
我已经在几个目标上使用了crosstool。只要你想从头开始构建工具链,它就非常好用。 当然,对于arm架构也有几个预构建的工具链,只需谷歌一下即可——太多了,这里不一一列举。
1)在我看来,构建自己的工具链效果最佳。你最终能够严格控制所有东西,而且如果你是嵌入式Linux的新手,这将是一个很好的学习机会。
2)不要选择商业工具链。即使你不想花时间构建自己的工具链,也有免费的替代品。
如果你的公司愿意出钱,让他们为你购买jtag调试器。它将节省大量时间,并且可以轻松学习和跟踪内核启动等过程。 我强烈推荐使用Lauterbach jtag产品......它们适用于大量目标平台,软件是跨平台的。他们的支持也非常好。
如果你无法使用jtag调试器,而你又在内核工作,则可以使用虚拟机(例如usermode linux、vmware等)来进行调试,你的代码将在x86上进行调试。将其移植到ARM目标上将是另一回事,但这是便宜的方法来消除一些错误。
如果你正在移植引导加载程序,请使用uboot。当然,如果你正在使用参考平台,那么最好使用他们提供的BSP。
希望这能帮到你。

现代版本的qemu支持gdbclient,因此只要您的ARM目标是qemu覆盖的目标之一,使用它作为虚拟测试环境效果不错,并且不需要在不同的架构上进行调试。但是,是的,没有JTAG端口的真实硬件是无法替代的。 - Charles Duffy
话虽如此,商业工具链并不都那么糟糕——我曾经为MontaVista工作,我相信我们在所有移植和调试工作中都有很多增值。当然,你可以轻松地自己制作最小的工具链,但是获取完整的嵌入式发行版需要更多的工作。 - Charles Duffy
1
Lauterbach确实很好,但价格也相当昂贵...! - Johan
非常正确,但总体而言,如果你考虑一下工程师的小时费率和 printk 调试的数量与工具成本的比较。它完全值得的。 - Steve Lazaridis

5

Buildroot是一个我用来从头开始构建自定义uClibc工具链的工具,我在使用它时运气不错。它非常可定制,并且对你正在运行的发行版并不过于挑剔。

此外,许多现有用户(即嵌入式路由器发行版)也针对ARM进行目标设置。


builtroot目前使用crosstool-ng(2014),Ubuntu和Linaro也是如此。这取决于您是否希望他们使用crosstool-ng,或者您愿意自己花时间配置。自回答此问题以来,许多项目已经从uClibc转向eglibc。如果您使用uClibc,许多软件包需要进行小的调整,因为其API与glibc不完全兼容。 - artless noise

3
如果你正在使用 Gentoo,获取交叉编译工具链非常容易: $ emerge crossdev $ crossdev -t $ARCH-$VENDOR-$OS-$LIBC
其中,ARCHarm 或者 armebVENDORunknown 或者 softfloatOSlinux,而 LIBCgnu 或者 uclibc
如果你只需要为内核使用编译器(以及链接器),则 LIBC 部分不相关。你可以使用 -s1/--stage1 告知 crossdev 你只需要 binutilsgcc

0

4
这实际上取决于系统有多小!大多数 ARM 系统都做不到这一点。 - Johan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接