我编写了一个linux内核模块,但是当我运行这个命令insmod ./...ko
时,内核发布了一个错误:未定义的符号......
之后,我搜索了很长时间,所有的解决方案都是使用EXPORT_SYMBOL()
,所以我把它写在内核代码中并重建内核。有趣的事情发生了,内核说exports duplicate symbol ... (owned by kernel)
。似乎符号不止一次导出,但如果是这样,为什么我以前不能使用它呢?
这是我模块中的相关代码:
extern struct task_struct *find_task_by_vpid(pid_t nr);
target_tsk = pid == -1 ? current : find_task_by_vpid(pid);
我将内核文件linux/sched.h
更改为以下格式:
extern struct task_struct *find_task_by_vpid(pid_t nr);
EXPORT_SYMBOL_GPL(find_task_by_vpid);
答案 0 :(得分:0)
符号导出(EXPORT_SYMBOL
)应在源文件(.c
)中执行,而不是在标头文件中执行({{1 }})。
这是因为导出符号是(某些其他)符号的定义,而头文件不适用于此类内容。