【问题标题】:kernel driver external modules not building completely内核驱动程序外部模块未完全构建
【发布时间】:2011-12-10 09:02:20
【问题描述】:

我正在向 android Gingerbread 内核添加一个外部驱动程序模块(类似于 Linux)。我以前做过,它有效,但这次我遇到了问题。我遵循 O'Reilly “Linux Device Drivers 3rd edition”中的配方:

在本地 Makefile 中,添加这些语句:

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

在人类语言中,这意味着从 GobiUSBNet.c + QMIDevice.c + QMI.c 为我构建一个 GobiNet.ko。

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

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

/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种方法可以做到这一点。我选择了上面描述的那个,因为所有的环境变量都是在顶级构建脚本中设置的,我不编译原生但我交叉编译。无论如何,内核树中的其他“.ko”已生成,因此构建脚本应该可以很好地生成“.ko”模块。

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

【问题讨论】:

    标签: makefile kernel-module


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我遇到了一些错误:aml_unregister_fe_drv ite9133_fe.ko undefined
    • 你能解释一下“A few quick greps”是什么意思吗?您是否遵循系统或如何确定在哪里搜索?
    【解决方案2】:

    另一种可能性是该函数已定义但未以某种方式导出(例如您编写自己的新函数但忘记导出,或某些合并问题)。然后修复是添加一行像

    EXPORT_SYMBOL_GPL(some_new_func);

    【讨论】:

      猜你喜欢
      • 2020-12-03
      • 2013-01-17
      • 1970-01-01
      • 2014-03-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      相关资源
      最近更新 更多