本文主要是介绍解决modpost: “enhance_kobj“ [drivers/usb/dwc3/dwc3-msm.ko] undefined!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在Android驱动移植,编译版本的时候,出现这个报错
18:11:51 ERROR: modpost: "enhance_kobj" [drivers/usb/dwc3/dwc3-msm.ko] undefined!
刚开始检查代码发现一切都正常,也未缺少enhance_kobj的定义,不明白为什么出现这个问题。问chatGPT,确认就是未定义
这次对比移植的老代码,一点点比对,发现原来是这里
drivers/usb/dwc3/dwc3-msm-core.c
#ifdef CONFIG_TEST_USB
struct dwc3_msm *test_mdwc ;
extern struct kobject *enhance_kobj;
#endif
drivers/usb/typec/ucsi/ucsi_glink.c
#ifdef CONFIG_TEST_USB
struct kobject *enhance_kobj = NULL;
EXPORT_SYMBOL(enhance_kobj);
#endif
之前在usci_glink.c驱动已定义enhance_kobj并EXPORT_SYMBOL,在dwc3-msm-core.c驱动使用的时候,只需要extern struct kobject *enhance_kobj即可。
这次移植抛弃了ucsi_glink.c驱动,所以也就忽略了原始定义,在dwc3-msm-core.c驱动里还是extern struct kobject *enhance_kobj,肯定要报错找不到enhance_kobj定义的。
struct kobject *enhance_kobj前面不要加static,否则会报错
19:40:17 LTO vmlinux.o
19:51:54 MODPOST vmlinux.symvers
19:51:54 ERROR: modpost: "enhance_kobj" [vmlinux] is a static EXPORT_SYMBOL
19:51:54 make[2]: *** [/Code/ap/kernel_platform/common/scripts/Makefile.modpost:64: vmlinux.symvers] Error 1
19:51:54 make[2]: *** Deleting file 'vmlinux.symvers'
19:51:54 make[1]: *** [/Code/ap/kernel_platform/common/Makefile:1296: vmlinux] Error 2
19:51:54 make: *** [/Code/ap/kernel_platform/common/Makefile:185: __sub-make] Error 2
注意EXPORT_SYMBOL也只需要在定义的地方声明一次就可以了,不需要在extern的地方继续声明。注意,如果定义的地方没有EXPORT_SYMBOL,也会出现上面的符号位定义的报错。
此外说明一下EXPORT_SYMBOL
作用就是将符号(symbols)导出,使得其他模块(ko)可以使用他们。在linux内核种,模块是可以在运行时插入和移除的,模块之间需要相互通信,所以需要模块之间共享符号。符号是指函数、变量或常量等在编译时由编译器生成的名字。例如,一个模块可以导出一个函数,供其他模块调用,或者导出一个变量,供其他模块读取或修改。
EXPORT_SYMBOL导出的符号可以被包含GPL许可权的模块和不包含GPL许可权的模块调用。
EXPORT_SYMBOL_GPL导出的符号只能被包含GPL许可权的模块调用。
总的来说,EXPORT_SYMBOL是linux内核种一个重要的机制,他使得模块之间可以相互调用,从而实现了内核的模块化设计。
参考
EXPORT_SYMBOL和其用户态类似的使用方式学习-CSDN博客
这篇关于解决modpost: “enhance_kobj“ [drivers/usb/dwc3/dwc3-msm.ko] undefined!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!