android - 编译 Android 内核的问题 + 使用 LiME 进行交叉编译

标签 android linux android-ndk cross-compiling android-kernel

正如标题所暗示的那样。在过去的几天里,我一直在努力成功编译 LiME(Linux 内存提取器)并将其加载到 Android 模拟器或物理设备上。要编译,我使用的是 arm-linux-androideabi-4.6,我目前在 x64 14.04 Ubuntu 上。
还:

unknown@unknown-A15:~$ uname -a
Linux unknown-A15 3.13.0-39-generic #66-Ubuntu SMP Tue Oct 28 13:30:27 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

因此,为了成功,我遵循了每个指南中关于在线的指示,但没有运气。(这可能是由于不同的 NDK/SDK/Unis Distro 版本或只是我的经验不足)
我读过的指南是那些(再加上2个指南,但不允许我发布更多链接。如果需要,我可以稍后在评论中发布它们):
  • https://code.google.com/p/volatility/wiki/AndroidMemoryForensics
  • http://sgros-students.blogspot.ca/2014/04/lime.html

  • 我主要关注第一个指南,但在尝试交叉编译内核时遇到了第一个问题。

    所以首先(在下载了金鱼内核源代码之后)我将它添加到/etc/profile 以使事情变得更简单:
    export CCOMPILER=~/android-ndk-r10c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
    source /etc/profile
    

    然后我做:
    make clean
    make mrproper
    cp path/to/exported_from_emulator_config .
    mv config .config
    # Add the 3 lines needed "CONFIG_MODULES=y", "CONFIG_MODULES_UNLOAD=y", "CONFIG_MODULES_FORCE_UNLOAD=y"
    sudo vim .config
    

    现在..我必须实际制作内核。但是在线指南上建议的所有内容都失败了。我努力了:
    make ARCH=arm CROSS_COMPILE=arm-eCross-eabi- EXTRA_CFLAGS=-fno-pic modules_prepare
    make CROSS_COMPILE=arm-eCross-eabi- EXTRA_CFLAGS=-fno-pic modules_prepare
    make CROSS_COMPILE=arm-eCross-eabi- modules
    

    但显然,由于我在此处发布的第二个指南中提到的原因,它们都失败了。所以.. 我已经对第二指南中的那些人提出的 Makefile 进行了更改(只是为了避免将 ARCH 作为 make 参数给出)。
    所以我能够以某种方式绕过所有下一个错误并最终编译如下:
    make CROSS_COMPILE=$CCOMPILER
    

    注1:我不断收到的一个错误是:
    /home/unknown/android-source/scripts/mksysmap: line 44: ~/android-ndk-r10c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-nm: No such file or directory
    make: *** [vmlinux] Error 1
    

    因此,我确实认为模块加载的 3 个内核选项没有被考虑在内。但这只是一个假设,因为我以前从未构建过 linux 内核。

    注2:我还必须注意,我相信在编译内核时 .confif 会被覆盖。我经常看到这个输出:
    .config:120:warning: override: reassigning to symbol MODULES
    

    我还尝试在运行 make 和 make 提示或使用 menuconfig 时编辑配置。然而没有运气。

    幸运的是,我通过简单地在调用 make 时输入 android eabis 的确切路径来绕过这个错误,如下所示:
    make CROSS_COMPILE=~/android-ndk-r10c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
    

    最后我设法拥有一个已编译的内核:
    ...
    SYSMAP  .tmp_System.map
    OBJCOPY arch/arm/boot/Image
    Kernel: arch/arm/boot/Image is ready
    AS      arch/arm/boot/compressed/head.o
    GZIP    arch/arm/boot/compressed/piggy.gz
    AS      arch/arm/boot/compressed/piggy.o
    CC      arch/arm/boot/compressed/misc.o
    LD      arch/arm/boot/compressed/vmlinux
    OBJCOPY arch/arm/boot/zImage
    Kernel: arch/arm/boot/zImage is ready
    

    所以现在我应该尝试使用 LiME 进行交叉编译!我不得不说我尝试编译它并使用Makefile,但每次我得到同样的错误。我已经使用了成功将 LiME 与 android 内核交叉编译的人在线提供的每个 Makefile(同时更改了内核和编译器路径),但没有运气。所以错误是:

    make ARCH=arm CROSS_COMPILE=~/android-ndk-r10c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi- -C ~/android-source M=/home/未知/石灰取证/src 模块
    make[1]: 进入目录/home/unknown/android-source' Building modules, stage 2. MODPOST 1 modules WARNING: "vfs_write" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "filp_close" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "filp_open" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "sock_sendmsg" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "memset" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "sock_setsockopt" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "sock_create_kern" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "param_get_int" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "param_set_int" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "param_get_charp" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "param_set_charp" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "iomem_resource" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "sscanf" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "strcmp" [/home/unknown/lime-forensics/src/lime.ko] undefined! WARNING: "__memzero" [/home/unknown/lime-forensics/src/lime.ko] undefined! CC /home/unknown/lime-forensics/src/lime.mod.o /home/unknown/lime-forensics/src/lime.mod.c:8:1: error: variable '__this_module' has initializer but incomplete type /home/unknown/lime-forensics/src/lime.mod.c:9:2: error: unknown field 'name' specified in initializer /home/unknown/lime-forensics/src/lime.mod.c:9:2: warning: excess elements in struct initializer [enabled by default] /home/unknown/lime-forensics/src/lime.mod.c:9:2: warning: (near initialization for '__this_module') [enabled by default] /home/unknown/lime-forensics/src/lime.mod.c:10:2: error: unknown field 'init' specified in initializer /home/unknown/lime-forensics/src/lime.mod.c:10:2: warning: excess elements in struct initializer [enabled by default] /home/unknown/lime-forensics/src/lime.mod.c:10:2: warning: (near initialization for '__this_module') [enabled by default] /home/unknown/lime-forensics/src/lime.mod.c:14:2: error: unknown field 'arch' specified in initializer /home/unknown/lime-forensics/src/lime.mod.c:14:10: error: 'MODULE_ARCH_INIT' undeclared here (not in a function) /home/unknown/lime-forensics/src/lime.mod.c:14:2: warning: excess elements in struct initializer [enabled by default] /home/unknown/lime-forensics/src/lime.mod.c:14:2: warning: (near initialization for '__this_module') [enabled by default] make[2]: *** [/home/unknown/lime-forensics/src/lime.mod.o] Error 1 make[1]: *** [modules] Error 2 make[1]: Leaving directory/home/unknown/android-source'
    make: *** [默认] 错误 2

    在对这些错误进行了一些搜索之后,我得出的结论是内核无效或与 LiME 进行交叉编译。这让我认为 .config 没有像我之前所说的那样被 make 考虑在内。

    我不太了解这个过程的低层次的东西,所以它可能是任何东西。我真的很感谢任何愿意花时间阅读我的帖子的人。我知道它很大:/

    任何建议,评论都非常欢迎!如果您需要更多信息或我需要解决某些问题,请告诉我。

    感谢大家 :)

    附言很抱歉使用愚蠢的标签,但不允许我使用更合适的不存在的标签,如“linux-memory-extractor”等。

    最佳答案

    好的,在 LiME 的开发人员 Joe 帮助我之后,我想通了。

    首先,为了避免在 make 时覆盖内核 .config,您应该这样做:

    make ARCH=arm CROSS_COMPILE=path/to/toolchains/bin goldfish_defconfig
    # then run menuconfig and enable all kernel module loading options and save with ESC
    make ARCH=arm CROSS_COMPILE=path/to/toolchains/bin menuconfig
    # then simply compile
    make ARCH=arm CROSS_COMPILE=path/to/toolchains/bin
    

    最后,如果必须,您可以添加以下内容:
    EXTRA_CFLAGS=-fno-pic
    

    尝试交叉编译 LiME 时!

    希望这对某人有帮助!

    P.S:我使用了来自 android ndk-r8 的 eabis。

    关于android - 编译 Android 内核的问题 + 使用 LiME 进行交叉编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26720566/

    相关文章:

    android - 如何关闭/隐藏Android自定义键盘

    java - 如何在android中获取IMEI、LAC/CELLID

    java - 使用 Android 小部件

    linux - 如何使用 awk 打印第三列值等于 "0"而不是 0 的所有行?

    linux - ALSA:播放音频的正确方法 - 阻塞模式和线程

    android - 尝试加载 opencv 库时出现 UnsatisfiedLinkError

    c++ - IN_ADDR 结构在 android 中奇怪地定义

    android - 使用 android studio 应用程序连接到谷歌云 mysql

    c++ - 关于为什么 Windows 的 .dll 不适用于 Linux 的细节

    android - 如何使用 Android NDK 的共享库(C 库添加到 C++)