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

在使用ndk r8编译Android内核模块时遇到加载错误,提示Unknown symbol _GLOBAL_OFFSET_TABLE_。查阅资料后,发现两种解决方案:1. 更新链接器脚本;2. 在模块编译时添加-fno-pic参数。最终通过添加-fno-pic参数解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用 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


模块成功加载!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值