安卓NDK能编译内核模块源码吗?

5

我想为安卓制作一个动态加载的内核模块。 我不想安装Linux,我只有Cygwin和安卓NDK。


由于Linux没有内核ABI,因此您必须为每个单独的内核编译模块。 - lovespring
我能否在已root的手机应用程序中加载LKM,以干扰系统调用。有什么想法吗? - Dev.Sinto
3个回答

3
是的,使用NDK可以构建内核模块。请注意,最好在Linux系统上进行操作(我被告知Linux x86_64是支持的环境),因为在大小写敏感的文件系统上(例如默认情况下在Windows和Mac系统上提供的文件系统)跨编译内核代码更加困难,并且构建内核模块需要构建ELF操纵二进制文件(modpost),这些文件需要ELF头通常只存在于Linux上。
话虽如此...
首先,您需要获取与设备上完全相同的内核源代码,并确保配置与您的设备相同。(否则可能会混淆构建系统)
其次,您需要确定Android NDK中的交叉编译器工具链的位置。以下是我找到自己工具链的方法:
$ cd $NDK_HOME
$ find . | grep '\-gcc$'
./toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin/arm-eabi-gcc
./toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc

注意,$NDK_HOME 是我安装 Android NDK 的位置。

第三步,您需要将 $NDK_HOME/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin 目录(或系统上它所在的地方)添加到您的 PATH 环境变量中。

然后您需要导出两个环境变量:

export ARCH=arm 
export CROSS_COMPILE=arm-eabi-

(注意,arm-eabi-前缀与我们在find命令中看到的相同。当内核构建时,如gccld等命令将带有此前缀。请注意,如果您正在为x86平台构建,则需要进行调整。我只为ARM构建了模块。)
接下来,您应该编译内核。(为此,我从Android设备中拉取了/proc/config.gz,在内核源目录中运行了zcat config.gz > .config,然后运行了make menuconfig && make。)内核构建大师可能知道一些快捷方式,但我无法正确设置内核源目录以构建模块而不进行实际构建。(如果您的构建树中的内核与您的设备匹配,则不必实际更新内核,只需插入模块即可。)
最后,我使用了正常的过程从源代码构建内核模块。通常,内核模块将具有参数化构建,该构建将以某种方式读取内核源树目录,然后调用构建。此时,只要内核源树正确设置并且设置了ARCHCROSS_COMPILE,您的模块就应该构建成功!
祝你好运。我确定每个设备都会有一些差异。

1

刚刚我发现了这个URL,用户尝试加载LKM并成功了,不过是在Android(内核核心:2.6.29)上,我认为它是在Linux而不是Cygwin上。希望你也能做到!

还有一个资源在这里也在这里

祝一切顺利!


0

按照这个URL,Android开发者建议使用虚拟Ubuntu镜像而不是Cygwin。


不,我不想编译Android,只需要一个新的内核模块。 - lovespring
抱歉,我迄今为止还没有遇到过这样的要求。由于我拥有整个源代码,我只需将我的模块添加到相应的驱动程序文件夹中,就可以得到我的自定义Android镜像。 - TheCottonSilk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接