我有兴趣在 x86 主机上为 ARM 目标交叉编译 Linux 内核。你有什么好的做法推荐吗?您认为哪个是最好的交叉编译套件?您是否设置了自定义交叉编译环境?如果是,您有什么建议?这是个好主意吗?
7 回答
我对 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 等的分发特定工具。
我使用 emdebian 工具链为我的 ARM 机器编译一些不喜欢在可用的小资源中本地编译的东西(/me 盯着内核)。主包是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,这可能不是那么有用,但口香糖对我来说效果很好。
我在尝试为使用 ARM 处理器的 maemo (Nokia N810) 构建应用程序时使用了scratchbox 。据说,scratchbox 不仅限于 maemo 开发。
我在几个目标上使用了 crosstool。只要您想从头开始构建工具链,那就太好了。当然,还有几个用于 arm 的预构建工具链,只需 google 即可 - 这里太多了。
1)在我看来,构建自己的工具链效果最好。您最终可以对所有内容进行严格控制,此外,如果您是嵌入式 linux 的新手,那将是一次很棒的学习体验。
2)不要使用商业工具链。即使您不想花时间构建自己的,也有免费的替代品。
如果你的公司愿意花钱,让他们给你买一个 jtag 调试器。
它将为您节省大量时间。 它使您可以轻松学习和逐步完成内核启动等。我强烈建议使用Lauterbach jtag 产品...它们可以处理大量目标,并且该软件是跨平台的。他们的支持也很棒。
如果您无法获得 jtag 调试器并且您正在内核中工作,请使用 VM 来执行此操作,用户模式 linux、vmware..etc.. 您的代码将在 x86 上进行调试.. 将其移植到您的 arm 目标将是一个不同的故事,但它是消除一些错误的更便宜的方法。
如果要移植引导加载程序,请使用 uboot。当然,如果您使用的是参考平台,那么您最好使用它们随 BSP 提供的东西。
我希望这会有所帮助。
Buildroot是一个我相当幸运的工具,用于从头开始构建基于 uClibc 的自定义工具链。它是非常可定制的,并且不会过分关注您碰巧在哪个发行版上运行。
此外,它的许多现有用户(即嵌入式路由器发行版)也瞄准了 ARM。
如果您使用的是 Gentoo,那么获得交叉编译工具链就像
$ 出现交叉开发 $ crossdev -t $ARCH-$VENDOR-$OS-$LIBC
其中ARCH
是arm
或armeb
,供应商是unknown
或softfloat
,OS
是linux
,并且LIBC
是gnu
或uclibc
。
如果您想要的只是内核的编译器(和链接器),则该LIBC
部分无关紧要,您可以使用-s1
/--stage1
来告知crossdev
您只需要binutils
和gcc
.
这就是 Eurotech用于他们的 Debian ARM 分布的东西。您会注意到,如果可以避免的话,他们不建议使用交叉编译器。在目标本身上编译往往是一种更可靠的方式来获取您知道将运行的输出。