由于情况各异,若本文方案解决不了,大家也可以参考本文评论区各路大佬的解决方案尝试解决。

注意!

本文仅针对找不到常用函数有用!!!
比如_printk、kfree、kmalloc、memset啥的;
如果不是常用函数,是自己其他模块中的函数,本文不适用。

背景

笔者在编译ko模块时,遇到了如下报错:
modpost提示的都是常用函数啊,比如_printk、kfree、kmalloc、memset啥的

ERROR: modpost: "__raw_copy_from_user" [/home/geng/Item/nscscc_drivers/lcd/lcd.ko] undefined!
ERROR: modpost: "_printk" [/home/geng/Item/nscscc_drivers/lcd/lcd.ko] undefined!
ERROR: modpost: "nonseekable_open" [/home/geng/Item/nscscc_drivers/lcd/lcd.ko] undefined!
ERROR: modpost: "kmalloc_caches" [/home/geng/Item/nscscc_drivers/lcd/lcd.ko] undefined!
ERROR: modpost: "kmalloc_trace" [/home/geng/Item/nscscc_drivers/lcd/lcd.ko] undefined!
ERROR: modpost: "kfree" [/home/geng/Item/nscscc_drivers/lcd/lcd.ko] undefined!
ERROR: modpost: "warn_slowpath_fmt" [/home/geng/Item/nscscc_drivers/lcd/lcd.ko] undefined!
ERROR: modpost: "memset" [/home/geng/Item/nscscc_drivers/lcd/lcd.ko] undefined!
ERROR: modpost: "__register_chrdev" [/home/geng/Item/nscscc_drivers/lcd/lcd.ko] undefined!

报错信息,都是ERROR: modpost!

一度怀疑是自己的Makefile、交叉编译器等出了问题…

解决方案

问题出在Linux内核原码的.config文件上!

把CONFIG_TRIM_UNUSED_KSYMS关闭掉就可以了!修改后记得重新make一下Linux源码! 修改后记得重新make一下Linux源码!

可以通过menuconfig修改,这里以MIPS的menuconfig为例:
menuconfig一级菜单 Enable loadable moudle support
关闭 Trim unused exported kernel symbols
也可以直接怼.config文件,把:

CONFIG_TRIM_UNUSED_KSYMS=y

直接换成

# CONFIG_TRIM_UNUSED_KSYMS is not set

修改后记得重新make一下Linux源码! 修改后记得重新make一下Linux源码!

更多推荐