带有内核调试符号的Android版本

时间:2018-10-19 12:57:40

标签: android linux-kernel kernel android-source

我正在尝试使用我自己编译的内核版本生成一个自定义的android映像,以在仿真器下运行(该想法是包括调试符号)。我在Google上找到了很多有关它的信息,因此我签出了android-goldfish-4.14-dev分支,并尝试对其进行了几次编译,但是当我运行编译后的内核时,就会发生此崩溃。

[    0.851597]  ? generic_make_request+0x123/0x300
[    0.852314]  submit_bio+0x73/0x140
[    0.852854]  ? bio_alloc_bioset+0xcc/0x1e0
[    0.853504]  ? submit_bio+0x73/0x140
[    0.854052]  ? guard_bio_eod+0x2c/0xf0
[    0.854622]  submit_bh_wbc+0x180/0x1b0
[    0.855195]  __bread_gfp+0x54/0xe0
[    0.855744]  ext4_fill_super+0x1f6/0x3a10
[    0.856377]  ? vsnprintf+0x24f/0x4e0
[    0.856943]  ? down_write+0x12/0x40
[    0.857497]  ? snprintf+0x45/0x70
[    0.858021]  mount_bdev+0x17f/0x1b0
[    0.858572]  ? mount_bdev+0x17f/0x1b0
[    0.859149]  ? ext4_calculate_overhead+0x490/0x490
[    0.859896]  ext4_mount+0x15/0x20
[    0.860420]  mount_fs+0x155/0x180
[    0.860942]  ? alloc_vfsmnt+0x1bb/0x230
[    0.861547]  vfs_kern_mount.part.23+0x80/0x150
[    0.862240]  do_mount+0x5ea/0xd20
[    0.862764]  ? memdup_user+0x4f/0x80
[    0.863329]  SyS_mount+0x98/0xe0
[    0.863842]  mount_block_root+0x109/0x2da
[    0.864478]  ? set_debug_rodata+0x17/0x17
[    0.865107]  mount_root+0x6a/0x6d
[    0.865634]  prepare_namespace+0x13e/0x176
[    0.866287]  kernel_init_freeable+0x224/0x251
[    0.866971]  ? rest_init+0xb0/0xb0
[    0.867507]  kernel_init+0xe/0x101
[    0.868045]  ret_from_fork+0x35/0x40

我正在尝试将其编译为在qemu x86下运行。

另一种可能是获取带有内核调试符号的android oreo图像;您知道是否有带有内核调试符号的预编译映像吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果问题实际上出在内核中,则以下是如何从源代码构建问题的说明。

1。获取内核源代码

首先,您需要确定要为其构建内核的设备。知道设备名称后,您可以为其克隆正确的Android内核源并进行构建。例如,对于金鱼,您应该使用以下内核:

https://android.googlesource.com/kernel/goldfish/

如果不确定设备要使用哪个内核,请尝试使用所谓的“ Android通用内核”:

https://android.googlesource.com/kernel/common/

基本上它是这样的:

  • Android通用内核基于常规Linux内核,并在其之上添加了一些Android特定的补丁程序
  • 用于特定设备的Android内核基于通用内核,并在其之上添加了一些特定于设备的补丁。

现在,您已“ git clone”了内核,签出要使用的版本分支:

$ git checkout android-4.14

2。配置工具链

我假设您要为x86_64体系结构构建内核。如果是这样,请按以下方式配置您的工具链:

$ export PATH=$AOSP_DIR/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9/bin:$PATH
$ export CROSS_COMPILE=x86_64-linux-androidkernel-
$ export ARCH=x86_64

其中$AOSP_DIR-到您的AOSP源的路径。如果您没有AOSP源代码,则可以单独获得工具链(位于内核源代码目录之外):

$ git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.9

3。获取Android内核配置

下载Android内核配置(位于内核目录外部):

$ git clone https://android.googlesource.com/kernel/configs android-kernel-configs

4。配置和构建内核

现在,在内核源代码目录中,您可以使用相应的defconfig文件和Android config片段创建内核配置(.config文件)。例如,对于金鱼,应使用以下命令:

$ ./scripts/kconfig/merge_config.sh \
    arch/x86/configs/x86_64_ranchu_defconfig \
    ../android-kernel-configs/android-4.14/android-base.config \
    ../android-kernel-configs/android-4.14/android-recommended.config \
    ../android-kernel-configs/android-4.14/android-recommended-x86.config

现在生成.config文件。此时,您可能需要运行make menuconfig并根据需要修改内核配置(例如,启用某些调试选项等)。

构建内核:

$ make -j4

它应该可以很好地构建,但是我没有对其进行测试(既没有建筑物,也没有在模拟器中运行)。因此,如果您可以验证这些说明是否有效,请提供您的评论。