最近一段时间,我一直在为我的Pixel XL编译自己的内核,并带有一些补丁。在Android 9.0之前,我需要为交叉编译器使用的是aarch64-linux-android-4.9,但是现在有了Android 9.0,它告诉我在内核的某些部分还需要ARM32工具链(我不记得了它说了,但这并不重要)。
无论如何,在XDA上,nathanchance拥有我用来学习如何构建内核的指南,他将其链接到arm-eabi-4.8的ARM32工具链以及AOSP上的“ Building Kernels”的旧版本。该网站过去也说过arm-eabi。新版本的“ Building Kernels”页面根本没有提到获得工具链,但是当我去获取arm-eabi-4.8时,我注意到arm-linux-androideabi-4.9也存在。
我的问题是,我应该使用arm-eabi-4.8还是arm-linux-androideabi-4.9?有什么不同?我能够同时使用两者构建内核(都没有进行测试,但是我认为它们都可以正常工作),但是我很好奇我实际上应该使用哪个内核(我很确定这是arm-linux -androideabi-4.9,因为它是在内核的构建配置中引用的),我想知道有什么区别。
答案 0 :(得分:2)
在构建内核(或裸机软件)时
(就内核而言)主要区别是用于构建它们的gcc版本。
三元组格式如下:
arch-sys-abi
在两种情况下,arch均为arm
(即ARM32)。在这种情况下,内核既是系统又是不可知的……因此这里没有区别。就内核而言,最后剩下的差异是arm-eabi-4.8
是针对gcc-4.8构建的,而arm-linux-androideabi-4.9
是针对gcc 4.9构建的。
在这种情况下,我建议使用Gcc 4.9,同样,此版本的gcc与android NDK中提供的版本相同(尽管这样做不会有很大的不同)。
-编辑-:
关于用户空间应用程序:
在这种情况下,实际上可以归结为工具链的版本,以及该工具链中包含哪个sysroot。
具体地说,arm-linux-anrdroideabi-4.9
在我看来就像是Android NDK工具链,因此它是基于android sysroot(平台工具和库)构建的。这意味着,如果您要以此构建用户应用程序,则可以访问其附带的所有库。
对于arm-eabi-4.8
,由于不包含任何系统,因此很可能是没有任何库的嵌入式目标。对于用户空间程序,这意味着该工具链根本没有库。 (这些工具链通常针对裸机开发,而不是针对任何实际的用户空间开发。)
免责声明:我没有检查那些特定的工具链来确定其中包括哪些库。
结论是,请记住,由于内核不是基于任何用户空间库构建的(出于明显的原因),因此这种差异不适用于内核构建。