我有兴趣在x86主机上为ARM目标交叉编译Linux内核。你推荐一些好的做法吗?您认为哪个是最好的交叉编译套件? 您是否已经确定了自定义交叉编译环境?如果是,您有什么建议?这是个好主意吗?
答案 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
其中ARCH
为arm
或armeb
,供应商为unknown
或softfloat
,OS
为linux
,{ {1}}是LIBC
或gnu
。
如果你想要的只是内核的编译器(和链接器),uclibc
部分是无关紧要的,你可以使用LIBC
/ -s1
通知--stage1
您只需要crossdev
和binutils
。
答案 6 :(得分:0)
This is what Eurotech uses用于他们的Debian ARM distibution。您会注意到,如果您可以避免使用交叉编译器,则不建议使用它们。编译目标本身往往是一种更可靠的方式来获取你知道会运行的输出。