android - 无法为 Android 编译 LKM

标签 android c linux android-ndk linux-kernel

我的编译环境是Ubuntu 12.04。

我还有Cyanogen mod内核的源代码(从Github获取:https://github.com/CyanogenMod/cm-kernel)

我使用 Android NDK r5c(适用于 Linux)中的工具链

我有以下代码:

#include <linux/kernel.h>
#include <linux/module.h>
#include <asm/unistd.h>

asmlinkage ssize_t (*orig_open)(const char *pathname, int flags);

asmlinkage ssize_t hooked_open(const char *pathname, int flags) {
    printk(KERN_INFO "SYS_OPEN: %s\n", pathname);
    return orig_open(pathname, flags);
}

void **sys_call_table;

static int __init root_start(void) {
    sys_call_table= (void *) 0x0030084;

    orig_open = sys_call_table[__NR_open];
    sys_call_table[__NR_open] = hooked_open;
    return 0;
}

static void __exit root_stop(void) {
    sys_call_table[__NR_open] = &orig_open;
}

module_init(root_start);
module_exit(root_stop);

这是我的Makefile:

obj-m += root.o

all:
    make -C CyanogenMod-cm-kernel-2a32a61/ M=$(PWD) ARCH=arm CROSS_COMPILE=arm-eabi- modules

我在终端中编译的步骤:

export PATH=$PATH:/home/hongnhat/lkm/android-ndk-r5c/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin
cd CyanogenMod-cm-kernel-2a32a61
make oldconfig && make prepare
cd ..
make

结果是:

make -C CyanogenMod-cm-kernel-2a32a61/ M=/home/hongnhat/lkm ARCH=arm CROSS_COMPILE=arm-eabi- modules
make[1]: Entering directory `/home/hongnhat/lkm/CyanogenMod-cm-kernel-2a32a61'

  WARNING: Symbol version dump /home/hongnhat/lkm/CyanogenMod-cm-kernel-2a32a61/Module.symvers
           is missing; modules will have no dependencies and modversions.

  CC [M]  /home/hongnhat/lkm/root.o
as: unrecognized option '-EL'
make[2]: *** [/home/hongnhat/lkm/root.o] Error 1
make[1]: *** [_module_/home/hongnhat/lkm] Error 2
make[1]: Leaving directory `/home/hongnhat/lkm/CyanogenMod-cm-kernel-2a32a61'
make: *** [all] Error 2

我不知道为什么它会抛出无法识别的选项“-EL”错误。 请帮我解决这个问题,我一直在努力尝试,我尝试使用不同的 gcc 版本(4.4.0、4.4.3、4.6)但没有用。

最佳答案

尝试使用 Sourcery Mentor 的 GCC 进行编译。我之前曾尝试过为Android编译Linux内核。也许有帮助。

关于android - 无法为 Android 编译 LKM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12277542/

相关文章:

android - 如何为 Firebase 身份验证用户设置自定义用户 UID?

java - Joda Time 的数据和时间表示

c - 如何使用按位运算符?

linux - 了解嵌入式板上经过验证的 Uboot

android - Google Play 服务 - 强制显示权限窗口(授予访问权限)

java - 将第一个 Activity 置于返回堆栈顶部

c++ - 为什么使用 _Bool 和 bool 而不是 int8_t 或 char?

c - 如何更改串行传输数据的字节序?

linux - 前缀包名的数字是什么意思?

Linux 套接字 UDP 服务器 - 在 2 台机器上的 2 个服务器之间交换消息