【问题标题】:Can the android NDK compile kernel module source?android NDK可以编译内核模块源码吗?
【发布时间】:2011-02-01 16:55:09
【问题描述】:

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

【问题讨论】:

  • 因为 linux 没有内核 ABI,所以你必须为每个单独的内核编译模块。 .
  • 我可以从root手机中的应用程序加载LKM,以干扰系统调用。有什么想法吗?

标签: android android-ndk


【解决方案1】:

是的,可以使用 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,您的模块就应该构建了!

祝你好运。我确定每个设备存在一些差异。

【讨论】:

    【解决方案2】:

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

    还有一个资源herehere too!。

    一切顺利!

    【讨论】:

      【解决方案3】:

      关注URL,Android 开发人员建议为此使用虚拟 Ubuntu 映像,而不是 cygwin。

      【讨论】:

      • 不,我不想编译android,只是一个新的内核模块。
      • 抱歉,到目前为止我还没有遇到过这样的要求。由于我有完整的源代码,我只是在各自的驱动程序文件夹中添加了我的模块并获得了我的自定义 android 图像。
      猜你喜欢
      • 2012-09-03
      • 1970-01-01
      • 2013-03-11
      • 2013-06-03
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多