就像标题所暗示的那样。在过去的日子里,我一直在努力地成功编译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
因此,为了成功实现这一目标,我在网上没有遵循每本指南的指导。.(这可能是由于diff NDK/SDK/Unis Distro versios或仅仅是我的经验不足)
我已经阅读了这些指南(另加2条指南,但是SO不允许我发布更多链接。如果需要,我可以在以后发表评论):
我主要关注第一个指南,但是在尝试交叉编译内核时遇到了第一个问题。
因此,首先(在下载了goldfish内核源代码之后),我将其添加到/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和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,但是每次遇到相同的错误时,我都会说。我使用了在线提供的每个Makefile,这些人成功地将编译后的LiME与android内核进行了交叉(当然更改了内核和编译器的路径),但是没有运气。因此错误是:
使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交叉编译。这让我认为make并没有像我之前所说的那样考虑.config。
我不太了解此过程的底层内容,因此可能是任何东西。我真的很感激任何愿意花时间阅读我的帖子的人。.我知道它的巨大意义:/
任何建议,意见都非常欢迎!如果您需要更多信息或需要解决某些问题,请告诉我。
感谢大家 :)
附言很抱歉使用愚蠢的标签,但是这样我将不允许我使用不存在的标签,这将更合适,例如“linux-memory-extractor”等。
最佳答案
好吧,在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时!
希望这对某人有帮助!
附注:我使用了来自android ndk-r8的eabis。