防盗链接:https://blog.youkuaiyun.com/Sharpneo/article/details/142676672
内核模块编译时,出现*.ko undefined!如何解决##
若我们需要将demo.c编译成demo.ko时出现了ERROR: “xxx” [*/demo.ko] undefined!
- 确保内核模块的Makefile编写无误。
- 其次检查:
内核中是否已经使用EXPORT_SYMBOL(xxx);导出对应符号。
并且是否在demo.c添加了函数申明,或者#include包含符号的头文件。
若内核中使用
EXPORT_SYMBOL_GPL(xxx);来导出对应符号,那么demo.c中必须使用MODULE_LICENSE("GPL");或者MODULE_LICENSE("Dual BSD/GPL");来添加相关证书。
-
然后检查内核模块导出符号上下文中是否存在宏定义开关,若存在宏定义开关,检查Linux编译目录的.config文件是否打开对应选项。
-
最后:
若上述步骤都没问题,比较容易遗漏的地方就是Makefile。查看xxx符号所在文件的当前目录下的Makefile。. ├── br_if.c ├── ... ├── Kconfig ├── Makefile └── netfilter比如我们要查看的xxx符号位于br_if.c,那么这时候需要注意同目录下的Makefile文件如下(忽略无关内容)。
obj-$(CONFIG_BRIDGE) += bridge.o bridge-y := br.o br_device.o br_fdb.o br_forward.o br_if.o br_input.o \ br_ioctl.o br_stp.o br_stp_bpdu.o \ br_stp_if.o br_stp_timer.o br_netlink.o \ br_netlink_tunnel.o br_arp_nd_proxy.o //...可以看到br_if.o被包含在bridge-y中,bridge-y为bridge.o的依赖项,若要将bridge.o编入内核,还需要启动CONFIG_BRIDGE选项。
如何查找编译选项位置:
https://www.kernelconfig.io/ (可能需要梯子)中可以搜索具体版本的某编译选项在menuconfig配置菜单中的位置。
1万+

被折叠的 条评论
为什么被折叠?



