使用LiME编译Android内核+交叉编译的问题

时间:2014-11-03 18:26:14

标签: 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 versios或仅仅是我的经验不足) 我读过的指南就是那些(另外还有2个指南,但SO赢了,不允许我发布更多链接..如果需要,我可以在以后发表评论):

  1. https://code.google.com/p/volatility/wiki/AndroidMemoryForensics
  2. http://sgros-students.blogspot.ca/2014/04/lime.html
  3. 我主要关注第一个指南,但在尝试交叉编译内核时遇到了我的第一个问题。

    首先(在下载了金鱼内核源代码之后),我将其添加到/ 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
    

    因此,我确实认为MODULE LOADING的3个内核选项没有被考虑在内。但这只是一个假设,因为我之前从未构建过Linux内核。

    注2:我还要注意,我相信在编译内核时,.confif会被覆盖。我经常看到这个输出:

    .config:120:warning: override: reassigning to symbol MODULES
    

    我还尝试在运行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 / unknown / lime-forensics / src modules     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。

    我真的不了解这个过程的低级别事情所以它可能是任何东西。我非常感谢那些花时间阅读我的帖子的人。我知道它的巨大:/

    任何建议,评论都非常欢迎!如果我需要更多信息或者我需要修理一些信息,请告诉我。

    谢谢大家:)

    P.S。很抱歉使用愚蠢的标签,但是我不会允许我使用不存在的标签,这些标签更合适,例如" linux-memory-extractor"等

1 个答案:

答案 0 :(得分:3)

好的,我在LiME的开发者Joe帮助我之后想出来了。

首先,为了避免在你做的时候覆盖你的内核.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。