【发布时间】: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”文件结束吗?
【问题讨论】: