在学习linux内核驱动开发时,需要导出模块符号并被另一个模块调用,报错显示符号导出被外部调用,但是在另一个模块中并没有找到对应的符号,报错如下:
tcy@tcy-virtual-machine:~/workSpace/3$ make
make -C /lib/modules/6.5.0-28-generic/build M=/home/tcy/workSpace/3 modules
make[1]: 进入目录“/usr/src/linux-headers-6.5.0-28-generic”
warning: the compiler differs from the one used to build the kernel
The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
You are using: gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
CC [M] /home/tcy/workSpace/3/hello.o
CC [M] /home/tcy/workSpace/3/printp.o
MODPOST /home/tcy/workSpace/3/Module.symvers
ERROR: modpost: /home/tcy/workSpace/3/hello: local symbol 'hi' was exported
ERROR: modpost: /home/tcy/workSpace/3/hello: local symbol 'prt' was exported
ERROR: modpost: "hi" [/home/tcy/workSpace/3/printp.ko] undefined!
ERROR: modpost: "prt" [/home/tcy/workSpace/3/printp.ko] undefined!
make[3]: *** [scripts/Makefile.modpost:144:/home/tcy/workSpace/3/Module.symvers] 错误 1
make[2]: *** [/usr/src/linux-headers-6.5.0-28-generic/Makefile:1991:modpost] 错误 2
make[1]: *** [Makefile:234:__sub-make] 错误 2
make[1]: 离开目录“/usr/src/linux-headers-6.5.0-28-generic”
make: *** [Makefile:7:all] 错误 2
两个模块代码分别如下:
模块一:
#include <linux/module.h>
#define CNT 1
static int cnt = CNT;
static char *hi = "Hi,Linux\n";
static int arr[] = {1, 2, 3, 4, 5, 6};
static int nums = sizeof(arr)/sizeof(int);
module_param(cnt, int, S_IRUGO); //传参函数,表示循环三次
module_param(hi, charp, S_IRUGO); //charp类型
module_param_array(arr, int, &nums, S_IRUGO); //整型数组
static void prt(void){
printk(KERN_INFO "this is hello module\n");
}
static int __init hello_init(void){
int i;
printk(KERN_INFO "HELLO LINUX MODULE\n");
for (i=0;i<cnt;i++){
printk(KERN_INFO "%d:%s", i, hi);
}
for (i = 0; i < 6; i++){
printk(KERN_INFO "%d ", arr[i]);
}
printk(KERN_INFO "nums:%d\n", nums);
return 0;
}
static void __exit hello_exit(void){
printk(KERN_INFO "GOODBYE LINUX\n");
}
module_init(hello_init);
module_exit(hello_exit);
EXPORT_SYMBOL_GPL(hi);
EXPORT_SYMBOL_GPL(prt);
MODULE_LICENSE("Dual BSD/BPL");
MODULE_AUTHOR("KGZ");
MODULE_VERSION("V1.0");
模块二:
#include <linux/module.h>
extern char *hi;
extern void prt(void);
static int __init printp_init(void){
printk(KERN_INFO "printp:%s", hi);
prt();
return 0;
}
static void __exit printp_exit(void){
}
module_init(printp_init);
module_exit(printp_exit);
MODULE_LICENSE("DUal BSD/GPL");
MODULE_AUTHOR("KGZ");
MODULE_VERSION("V1.0");