最近学习Linux 驱动,自己动手写了一个温度传感器的I2C驱动模块,调试完成后想试着把驱动模块编译进Linux 内核中,开机启动就不用insmod了,配置完Kconfig后编译一直出现“drivers/built-in.o:(.data+0x0): undefined reference to `__this_module'”的问题,导致内核编译失败。检查了多遍确认加入了“#include <linux/module.h>”头文件还是会出现这个问题,百度多遍依旧没相关的解决方案。第二天反复查看代码终于发现问题:之前学习写驱动模块按照教程在代码头部加入了宏定义。
#ifndef MODULE
#define MODULE
#endif
该宏定义导致<include/linux/module.h>中THIS_MODULE被定义为#define THIS_MODULE (&__this_module),而在编译进内核的时候__this_module没有定义于是出现“undefined reference to `__this_module'”问题。将#define MODULE注释后内核编译通过,上电顺利启动,驱动加载成功。
#ifdef MODULE
#define MODULE_GENERIC_TABLE(gtype,name) \
extern const struct gtype##_id __mod_##gtype##_table \
__attribute__ ((unused, alias(__stringify(name))))
extern struct module __this_module;
#define THIS_MODULE (&__this_module)
#else /* !MODULE */
#define MODULE_GENERIC_TABLE(gtype,name)
#define THIS_MODULE ((struct module *)0)
#endif
另转对THIS_MODULE的理解:https://blog.csdn.net/heybeaman/article/details/79583649 。