【问题标题】:Error while trying to compile android kernel in ubuntu尝试在 ubuntu 中编译 android 内核时出错
【发布时间】:2016-02-25 15:12:37
【问题描述】:

我正在尝试从源代码编译 Android 内核,并且我已经下载了所有正确的包来执行此操作,但由于某种原因我收到此错误:

arm-linux-androideabi-gcc: error: unrecognized command line option '-mgeneral-regs-only'
/home/livlogik/android/kernel/H901BK_L_Kernel/./Kbuild:35: recipe for target 'kernel/bounds.s' failed
make[1]: *** [kernel/bounds.s] Error 1
Makefile:858: recipe for target 'prepare0' failed
make: *** [prepare0] Error 2

我有最新的 NDK,如果有帮助,我正在使用 Ubuntu 15.10 64 位。

这里是我拥有 NDK 和内核的地方:

NDK ---- /home/livlogik/android/ndk/

内核 ---- /home/livlogik/android/kernel/H901bk_L_Kernel/

如果有人可以帮助我,那就太好了。抱歉,如果这已经发布,我可以找到答案。

谢谢,

扎克

【问题讨论】:

  • 似乎是错误的工具链。试试this 一个。像往常一样,请务必在构建之前正确设置 PATHCROSS_COMPILEARCH 环境变量。
  • @SamProtsenko 这个工具链将适用于 Android 内核。在内部文件中看起来与 NDK 中的工具链不同。另外,当您说设置 PATH、CROSS_COMPILE 和 ARCH 时,您是指在 .bashrc 文件中吗?对不起,我很抱歉,这是我第一次弄乱 Android 内核。感谢您的帮助
  • 是的,这是 ARM 裸机 gcc 工具链,我很确定它适用于内核。至于变量——你可以通过export命令在你的shell中设置它们,比如export PATH=......:$PATH等。然后在这个shell中运行make,这些变量将被内核Makefile使用。
  • 下载工具链见this,配置工具链见this。要构建内核,我猜你需要先运行make defconfig(甚至在应用Android更改之前使用merge_config.sh脚本),然后运行make来构建内核。最后我猜你需要为你的板子构建设备树。
  • 您的 NDK 工具链也应该可以正常工作,可能是您没有正确配置它(我提到的那些变量)。请特别注意PATH,它应该包含工具链的bin/ 目录的路径,然后是之前的PATH 值。还要确保您从 NDK 中选择了正确的工具链(如果那里有多个工具链)。

标签: android linux-kernel arm64


【解决方案1】:

从构建错误信息可以看出:

drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c:20:27:致命错误:./mh1/msm_mh1.h:没有这样的文件或目录

#include <.>

编译器找不到msm_mh1.h 文件。这是因为为#include 指令指定的路径不正确。很可能是错字:而不是./,应该是../

要修复该错误,请在 drivers/media/platform/msm/camera_v2/sensor/msm_sensor.c 文件中更改此行:

#include <./mh1/msm_mh1.h>

到这一行

#include "../mh1/msm_mh1.h"

在此make 命令之后应该可以正常工作。此外,内核映像文件将在arch/arm64/boot 提供,它不是文档中所述的zImage,它实际上是Image.gz。未压缩的内核映像为Image 文件。

更新

在 cmets 中回答您的问题:

有什么办法可以把它压缩成zImage吗?

来自Documentation/arm64/booting.txt

AArch64 内核目前不提供解压器和 因此需要通过引导执行解压缩(gzip 等) 如果使用压缩的Image 目标(例如Image.gz),则加载程序。为了 不实现此要求的引导加载程序,未压缩的 Image 目标可用。

基本上zImage 只是压缩和自解压Image。所以zImage文件包含一开始解压gzip压缩包的程序,然后是gzip压缩的Image,当内核由引导加载程序运行时,它会自行解压(即“自解压”术语)然后开始运行。

...所以我可以让它变成可闪光的

在 arm64 的情况下,您没有 zImage,因此很可能您需要使用 Image 文件(其作用相同,但它的大小更大)。您可以从Image 文件创建boot.img 并构建AFS ramdisk(使用mkbootimg 工具),然后只需执行fastboot flash boot boot.img。例如,请参阅 this 文档。当然,对于您的平台,有些事情可能会有所不同,因此请尝试查找适合您平台的说明。

【讨论】:

  • 你太棒了!今晚晚些时候我会试试这个,然后交叉手指!谢谢楼主,没想到
  • 甜谢谢它编译,我没有看到任何错误!有没有办法让它压缩成zImage?所以我可以让它变成可闪动的
  • 请参阅答案中的更新
  • 好的,所以没有办法让它像 cwm 或 twrp 那样在恢复中可闪现?他们将不得不通过 fastboot 刷新它?
  • 我不知道CWM/TWRP(从来没听说过),但是如果它允许你flash boot分区,你可以使用获得的boot.img文件(我描述了如何创建它) 并将其闪存到引导分区。因为boot.img 只是引导分区的映像。够了吗?如果不是,请描述 CWM/TWRP 使用的图像格式,也许我可以帮助您想出一些方法来从内核的 Image 文件中创建它。
【解决方案2】:

您必须安装正确的工具链: git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9

并适当配置 Makefile

错误工具链在 git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/arm/arm-linux-android-4.9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2012-05-12
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多