2015-09-19 132 views
0

我正在編譯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。並根據生成文件

obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o 

其中我建立選擇CONFIG_DRM_KMS_HELPER該模塊。在.config中,當我構建我的模塊時,這與模塊直接成比例,這也會在模塊中生成,否則它會靜態構建。但是,當它在模塊中生成時,文件不會被編譯。

任何想法?我如何強制這個進入靜態構建,而在模塊中做我的驅動程序?

+0

請點擊這裏把精確的輸出代替

obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o 

。 –

+0

是否所說的驅動程序實際上支持被構建爲模塊(如in,是它的Kconfig條目「tristate」,還是「bool」)? – Notlikethat

+1

提供錯誤信息。看來該模塊需要不會被導出到模塊的符號。 – 0andriy

回答

-1

作爲一種變通方法,您可以通過comiler的

obj-y += drm_kms_helper.o 
+0

已經嘗試過,但還有一些其他錯誤出現 – theadnangondal

+0

爲什麼不只是'CONFIG_DRM_KMS_HELPER = y'? – 0andriy

+0

@Andy Shevchenko:由於無法直接選擇CONFIG_DRM_KMS_HELPER的狀態,因此Kbuild每次構建內核時都會覆蓋其值。該選項總是由另一個選擇,如果鏈中的一個選擇器是「m」,則該選項將取值「m」。 –