【发布时间】:2015-12-16 12:23:57
【问题描述】:
我正在编译 linux 内核版本 3.17。默认情况下,驱动程序被静态编译到 linux 内核中,并在启动时进行探测。但是我希望将这个特定的驱动程序构建为一个模块,因此我将 CONFIG_driver 从“y”更改为“m”。但是在这样做之后,内核会输出一个未定义的引用错误并中断构建。
以下控制台日志
| LD drivers/built-in.o
| LINK vmlinux
| LD vmlinux.o
| MODPOST vmlinux.o
| GEN .version
| CHK include/generated/compile.h
| UPD include/generated/compile.h
| CC init/version.o
| LD init/built-in.o
| drivers/built-in.o: In function `adv7511_irq_handler':
| /var/adnan/work/git/mel_repos/mel_cedar_2/build/build_zedboard-zynq7-mel/tmp/work-shared/zedboard-zynq7-mel/kernel-source/drivers/gpu/drm/i2c/adv7511_core.c:314: undefined reference to `drm_helper_hpd_irq_event'
| make: *** [vmlinux] Error 1
| ERROR: oe_runmake failed
函数drm_helper_hpd_irq_event 存在于drm_probe_helper.c 中。并根据makefile
obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
我正在构建的模块选择CONFIG_DRM_KMS_HELPER。在 .config 中,当我构建模块时,这与我的模块成正比,这也会在模块中构建,否则它会静态构建。但是当它在模块中构建时,文件没有被编译。
有什么想法吗?在模块中执行驱动程序时如何强制将其转换为静态构建?
【问题讨论】:
-
请把编译器的准确输出放在这里。
-
该驱动程序是否真的支持构建为一个模块(例如,它的 Kconfig 条目是“三态”,还是只是“布尔”)?
-
提供错误一周围的行。似乎该模块需要未导出到模块的符号。
-
DRM_KMS_HELPER 是否设置为构建?
标签: c linux linux-kernel operating-system linux-device-driver