makefile - 内核驱动程序外部模块未完全构建

标签 makefile kernel-module

我正在将外部驱动程序模块添加到 android Gingerbread 内核(与 Linux 类似)。我以前做过并且有效,但这次我遇到了问题。我遵循 O'Reilly“Linux 设备驱动程序第 3 版”中找到的方法,即:

在本地 Makefile 中,添加以下语句:

   obj-m := GobiNet.o  
   GobiNet-objs :=  GobiUSBNet.o QMIDevice.o QMI.o  

用人类语言来说,这意味着从 GobiUSBNet.c + QMIDevice.c + QMI.c 构建一个 GobiNet.ko。

这是针对构建整个内核时调用 makefile 的情况。我正在 Ubuntu x86-64 位上针对 ARM-EABI 系统 (Cortex-A8) 进行交叉编译。

不知何故,构建系统理解我想要什么,因为它在编译时说:

/home/sylvain/Projects/android_gingerbread_realv210_ver_1_0/kernel  
   CHK     include/linux/version.h  
   CHK     include/generated/utsrelease.h  
make[1]: `include/generated/mach-types.h' is up to date.  
   CALL    scripts/checksyscalls.sh  
   CHK     include/generated/compile.h  
   LD      drivers/cell/OptionGobiNet/built-in.o  
   CC [M]  drivers/cell/OptionGobiNet/GobiUSBNet.o  
   CC [M]  drivers/cell/OptionGobiNet/QMIDevice.o  
   CC [M]  drivers/cell/OptionGobiNet/QMI.o  
   LD [M]  drivers/cell/OptionGobiNet/GobiNet.o  
   Kernel: arch/arm/boot/Image is ready  
   SHIPPED arch/arm/boot/compressed/lib1funcs.S  
   AS      arch/arm/boot/compressed/lib1funcs.o  
   LD      arch/arm/boot/compressed/vmlinux  
   OBJCOPY arch/arm/boot/zImage  
   Kernel: arch/arm/boot/zImage is ready       
   Building modules, stage 2.  
   MODPOST 5 modules  
ERROR: "usbnet_suspend" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined!  
ERROR: "usbnet_resume" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined!  
ERROR: "usbnet_disconnect" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined!  
ERROR: "usbnet_probe" [drivers/cell/OptionGobiNet/GobiNet.ko] undefined!  
make[1]: *** [__modpost] Error 1  
make: *** [modules] Error 2   

它还会生成典型的“GobiNet.mod.c”和“GobiNet.o”,当您希望驱动程序作为模块但它不符合我期望的“GobiNet.ko”时生成。我在主目录中运行了“find -name *.ko”,却找不到“GobiNet.ko”。

我还查看了 WEB 和 kernel/documentation/kbuild/*.txt。大约有 3 种方法可以做到这一点。我选择了上面描述的一种,因为所有环境变量都是在顶部构建脚本中设置的,并且我不编译 native ,但我交叉编译。无论如何,内核树中的其他“.ko”已生成,因此构建脚本应该可以很好地生成“.ko”模块。

你知道是什么让这个过程开始但不以“.ko”文件结束吗?

最佳答案

我找到了解决方案。我真的误解了错误消息以及“.ko”模块如何与内核交互。外部模块在编译/链接时而不是在运行时解析外部(至少是一些)。这就是为什么我收到 4 个“错误”的原因。

也就是说,我的“GobiNet”正在寻找我的内核设置中不存在的外部符号。一些快速的 grep 让我找到它需要的“drivers/net/usb/usbnet.c”。这需要在“.config”文件中设置 CONFIG_USBNET = y(通过“make xconfig”设置)。希望它可以帮助别人。

编辑:回答有关“一些快速 grep”的问题。我的意思是我搜索包含丢失名称的所有源文件。它会告诉我哪个文件定义了该符号。然后,我可以找到应该将哪个变量设置为“y”以将其包含在编译中。这是一个例子:

grep -r --include="*.c" "usbnet_probe"

您可以在终端中从要递归搜索的文件夹(-r 选项)执行该命令。 grep 对于在大量文件中查找文本非常有用。我经常不记得具体的内容,但快速的谷歌搜索可以让你如何执行一些非常棘手的搜索,你从未想过可以如此轻松地完成。

关于makefile - 内核驱动程序外部模块未完全构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7812418/

相关文章:

linux - IAR 的生成文件。源列表

linux - Linux 内核代码中的 EXPORT_SYMBOL_GPL 是什么?

linux - 测量函数的执行时间和 linux 模块中的调用计数

android - 拦截Android内核中的系统调用——移除模块时设备重启

linux - 转义系统变量以作为参数传递给 make

在 C 中编译包含 libmodbus 的程序

使用 clang 编译最小测试共享库

c - 如何将一个 c 文件链接到两个可执行文件

linux - 使用模块读取内核内存

c - 从内核模块获取对输入设备的引用