【问题标题】:compile a static kernel driver to module编译静态内核驱动到模块
【发布时间】: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


【解决方案1】:

作为一种解决方法,您可以替换

obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o

obj-y += drm_kms_helper.o

【讨论】:

  • 为什么不直接CONFIG_DRM_KMS_HELPER=y
  • @Andy Shevchenko:这行不通,因为您不能直接选择 CONFIG_DRM_KMS_HELPER 的状态,每次构建内核时,Kbuild 都会覆盖其值。该选项始终由另一个选项选择,如果链中的选择器之一是“m”,则该选项将采用值“m”。
  • @theadnangondal:您能否指出您正在尝试构建的内核源代码以及您正在使用的 defconfig 或您拥有的 .config?
  • make CONFIG_DRM_KMS_HELPER=y 我想应该可以工作。
猜你喜欢
  • 2021-09-09
  • 2013-11-12
  • 2023-04-03
  • 2021-03-20
  • 2011-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多