ndk 编译android内核模块无法加载 解决方法

使用 ndk r8 编译cm的android内核,内核可以正常启动,但无法加载无线模块


# insmod *
insmod: init_module 'bcm4329.ko' failed (No such file or directory)

# busybox insmod *
insmod: can't insert 'bcm4329.ko': unknown symbol in module, or unknown parameter

查看内核日志提示

<4>[ 5335.223480] bcm4329: Unknown symbol _GLOBAL_OFFSET_TABLE_ (err 0)


Google了一下,找到了两种解决办法


https://groups.google.com/group/android-kernel/browse_thread/thread/773108395bb1b44a

I get the same thing, 'arm-eabi-4.4.0/bin/arm-eabi-' seems to work fine though.
1、采用通用交叉编译器编译模块

http://tydus.org/blog/compile-android-kernel-msm7x30.htm

注意
用r5b以上的NDK编译出来的内核模块会失败(提示Unknown symbol _GLOBAL_OFFSET_TABLE_),直接影响是没有WLAN,在Makefile改一下,对模块的编译加上-fno-pic参数就可以了。

--- a/Makefile
+++ b/Makefile
@@ -325,7 +325,7 @@ CHECK               = sparse
 
 CHECKFLAGS     := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
                  -Wbitwise -Wno-return-void $(CF)
-MODFLAGS       = -DMODULE
+MODFLAGS       = -DMODULE -fno-pic
 CFLAGS_MODULE   = $(MODFLAGS)
 AFLAGS_MODULE   = $(MODFLAGS)
 LDFLAGS_MODULE  = -T $(srctree)/scripts/module-common.lds

2、模块添加 -fno-pic参数


电脑上正好有arm交叉编译器,所以我采用的第一种方法

make modules CROSS_COMPILE=arm-linux- ARCH=arm -j 4

模块成功加载!

你可能感兴趣的:(Android)