建構核心模組
我有一個正在嘗試交叉編譯的第 3 方設備驅動程序。當我建構驅動程序時,一切都很順利,但我沒有看到任何 driver.ko 文件,但是 driver.o 文件生成正常,並且在建構過程中我沒有看到任何錯誤。我也嘗試使用選項 V=1 並且看到以下錯誤
echo; echo " ERROR: Kernel configuration is invalid."; echo " include/generated/autoconf.h or include/config/auto.conf are missing."; echo " Run 'make oldconfig && make prepare' on kernel src to fix it."; echo;
但是我的核心配置是正確的,我已經嘗試了一個簡單的 hello world 模組,在這種情況下,我可以建構我的模組,但仍然看到這個錯誤消息。我也可以看到文件
include/generated/autoconf.h
和include/config/auto.conf
核心原始碼。仍然為什麼我無法建構我的驅動程序模組。我正在交叉編譯 ARM 平台的驅動程序,因此 /lib/modules 在這種環境下不會很好。其次,這裡是建構的輸出。
LD [M] /home/farshad/Work/CSP/boards/imx6q/ar6k3/ar6003_3.1_RC_Linux_release_[posted_2011_8_19_olca3.1RC_553/imx6build/host/os/linux/ar6000.o Building modules, stage 2. MODPOST 0 modules make[2]: Leaving directory `/home/farshad/Work/CSP/projects/phase_1/farshad/cspbox/platform/imx6/mel5/fs/workspace/linux-2.6.38-imx6'
正如您在上面看到的 ar6000.o 正確建構而沒有任何錯誤,但為什麼沒有建構 ar6000.ko 否則它應該報告“MODPOST 1 模組”。由於在完整建構過程結束時未建構 ar6000.ko,因此我也收到以下錯誤
cp: cannot stat `/home/farshad/Work/CSP/boards/imx6q/ar6k3/ar6003_3.1_RC_Linux_release_[posted_2011_8_19_olca3.1RC_553/imx6build/host/os/linux/ar6000.ko': No such file or directory 2404 make[1]: *** [install] Error 1
這是顯而易見的。我的問題是為什麼我一開始就沒有得到 ar6000.ko。在Google上搜尋有人也遇到了這個問題,並提到用 sudo 執行 make 解決了它,但它沒有給我帶來運氣!
我在徘徊我的核心配置是否有任何問題(即驅動程序正在尋找一些我尚未在我的核心中啟用的配置設置,但在這種情況下它應該給編譯器錯誤尋找所需的#define),另一點可能是驅動程序建構系統存在問題,我正在努力解決這個問題。我的交叉編譯環境很好,因為我在為我的(Ubuntu x86)機器建構相同的驅動程序時看到了完全相同的問題!
更新#1
它是一個第 3 方驅動程序包,它還與驅動程序模組一起建構其他實用程序。這是驅動模組建構過程的輸出
make CT_BUILD_TYPE=MX6Q_ARM CT_OS_TYPE=linux CT_OS_SUB_TYPE= CT_LINUXPATH=~/Work/CSP/projects/phase_1/farshad/cspbox/platform/imx6/mel5/fs/workspace/linu x-2.6.38-imx6 CT_BUILD_TYPE=MX6Q_ARM CT_CROSS_COM PILE_TYPE=~/bin/mgc/CodeSourcery/Sourcery_CodeBench_for_ARM_GNU_Linux/bin/arm-none-linux- gnueabi- CT_ARCH_CPU_TYPE=arm CT_HC_DRIVERS=pci_std/ CT_MAKE_INCLUDE_OVERRIDE= CT_BUILD_OUTPUT_OVERRIDE=/home/far shad/Work/CSP/boards/imx6q/ar6k3/ar6003_3.1_RC_Linux_release_[posted_2011_8_19_olca3.1RC_553 /imx6build/host/.output/MX6Q_ARM-SDIO/image -C /home/farshad/Work/CSP/boards/imx6q/ar6k3/ar6003_3.1_RC_Linux _release_[posted_2011_8_19_olca3.1RC_553/imx6build/host/sdiostack/src default make[3]: Entering directory `/home/farshad/Work/CSP/boards/imx6q/ar6k3/ar6003_3.1_RC_Linux_release_[posted_2011_8_19_olc a3.1RC_553/imx6build/host/sdiostack/src' make -C ~/Work/CSP/projects/phase_1/farshad/cspbox/platform/imx6/mel5/fs/workspace/linux-2.6.38-imx6 SUBDIRS=/home/farshad/Work/CSP/boards/imx6q/ar6k3/ar6003_3.1_RC_Linux_release_[posted_2011_8_19_olca 3.1RC_553/imx6build/host/sdiostack/src ARCH=arm CROSS_COMPILE=~/bin/mgc/CodeSourcery/Sourcery_CodeBench_for_ARM_GNU_Linux/bin/arm-none-linux-gnueabi- EXTRA_CFLAGS="-DLINUX -I/home/farshad/Work/CSP/board s/imx6q/ar6k3/ar6003_3.1_RC_Linux_release_[posted_2011_8_19_olca3.1RC_553/imx6build/host/sdiostack/src/include -DDEBUG" modules make[4]: Entering directory `/home/farshad/Work/CSP/projects/phase_1/farshad/cspbox/platform/imx6/mel5/fs/workspace/linux-2.6.38-imx6' Building modules, stage 2. MODPOST 0 modules make[4]: Leaving directory `/home/farshad/Work/CSP/projects/phase_1/farshad/cspbox/platform/imx6/mel5/fs/workspace/linu x-2.6.38-imx6'
這是驅動模組的Makefile。
ifdef CT_MAKE_INCLUDE_OVERRIDE -include $(CT_MAKE_INCLUDE_OVERRIDE) else -include localmake.$(CT_OS_TYPE).inc -include localmake.$(CT_OS_TYPE).private.inc endif export CT_OS_TYPE export CT_OS_SUB_TYPE export CT_OS_TOP_LEVEL_RULE export CT_PASS_CFLAGS export CT_SRC_BASE export CT_BUILD_SUB_PROJ # this makefile can only be invoked from the /EMSDIO/src base CT_SRC_BASE :=$(shell pwd) # export flags for which HCDs to build. Set the hcd driver name in hcd/ in your localmake.*.inc file. export CT_HC_DRIVERS export PDK_BUILD export HDK_BUILD export ALL_BUILD export ATHRAW_FD_BUILD export BUS_BUILD # For Linux ifeq ($(CT_OS_TYPE),linux) #make a copy for linux 2.4 EXTRA_CFLAGS += -DLINUX -I$(CT_SRC_BASE)/include ifneq ($(CT_RELEASE),1) EXTRA_CFLAGS += -DDEBUG endif export EXTRA_CFLAGS CT_SRC_OUTPUT :=$(CT_SRC_BASE)/../output ifdef CT_BUILD_OUTPUT_OVERRIDE _CT_COMPILED_OBJECTS_PATH :=$(CT_BUILD_OUTPUT_OVERRIDE) _MAKE_OUTPUT_DIR := _CLEAN_OUTPUT_DIR := else _CT_COMPILED_OBJECTS_PATH := $(CT_SRC_OUTPUT)/$(CT_BUILD_TYPE) _MAKE_OUTPUT_DIR := mkdir --parents $(_CT_COMPILED_OBJECTS_PATH) _CLEAN_OUTPUT_DIR := rm -R -f $(CT_SRC_OUTPUT) endif ifeq ($(CT_OS_SUB_TYPE),linux_2_4) CT_PASS_CFLAGS := $(EXTRA_CFLAGS) _CT_MOD_EXTENSION :=o ifeq ($(ALL_BUILD),1) subdir-m += busdriver/ lib/ hcd/ function/ else ifeq ($(BUS_BUILD),1) subdir-m += busdriver/ lib/ hcd/ else ifeq ($(PDK_BUILD),1) subdir-m += function/ else ifeq ($(HDK_BUILD),1) subdir-m += hcd/ function/ endif endif endif endif # add in rules to make modules CT_OS_TOP_LEVEL_RULE :=$(CT_LINUXPATH)/Rules.make include $(CT_OS_TOP_LEVEL_RULE) else #2.6+ _CT_MOD_EXTENSION :=ko ifeq ($(ALL_BUILD),1) obj-m += busdriver/ lib/ hcd/ function/ else ifeq ($(BUS_BUILD),1) obj-m += busdriver/ lib/ hcd/ else ifeq ($(PDK_BUILD),1) obj-m += function/ else ifeq ($(HDK_BUILD),1) obj-m += hcd/ function/ endif endif endif endif endif ifdef CT_BUILD_SUB_PROJ _CT_SUBDIRS=$(CT_BUILD_SUB_PROJ) else _CT_SUBDIRS=$(CT_SRC_BASE) endif ifdef CT_CROSS_COMPILE_TYPE CT_MAKE_COMMAND_LINE=$(CT_OUTPUT_FLAGS) -C $(CT_LINUXPATH) SUBDIRS=$(_CT_SUBDIRS) ARCH=$(CT_ARCH_CPU_TYPE) CROSS_COMPILE=$(CT_CROSS_COMPILE_TYPE) else CT_MAKE_COMMAND_LINE=$(CT_OUTPUT_FLAGS) -C $(CT_LINUXPATH) SUBDIRS=$(_CT_SUBDIRS) endif makeoutputdirs: $(_MAKE_OUTPUT_DIR) default: makeoutputdirs echo " ************ BUILDING MODULE ************** " $(MAKE) $(CT_MAKE_COMMAND_LINE) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" modules echo " *** MODULE EXTENSION = $(_CT_MOD_EXTENSION)" $(CT_SRC_BASE)/../scripts/getobjects.scr $(CT_SRC_BASE) $(_CT_COMPILED_OBJECTS_PATH) $(_CT_MOD_EXTENSION) ifeq ($(CT_OS_SUB_TYPE),linux_2_4) # on 2.4 we can't invoke the linux clean with SUBDIRS, it will just clean out the kernel clean: find $(_CT_SUBDIRS) \( -name '*.[oas]' -o -name core -o -name '.*.flags' -o -name '.ko' -o -name '.*.cmd' \) -type f -print \ | grep -v lxdialog/ | xargs rm -f $(_CLEAN_OUTPUT_DIR) else clean: $(MAKE) $(CT_MAKE_COMMAND_LINE) clean find $(_CT_SUBDIRS) \( -name '*.[oas]' -o -name core -o -name '.*.flags' \) -type f -print \ | grep -v lxdialog/ | xargs rm -f $(_CLEAN_OUTPUT_DIR) endif endif # For QNX ifeq ($(CT_OS_TYPE),qnx) LIST=VARIANT EARLY_DIRS=lib ##ifndef QRECURSE QRECURSE=./recurse.mk ##ifdef QCONFIG ###QRDIR=$(dir $(QCONFIG)) ##endif ##endif include $(QRDIR)$(QRECURSE) endif
好的,我已經找到了問題所在。我在模組源目錄中有方括號字元“[”
LD [M] /home/farshad/Work/CSP/boards/imx6q/ar6k3/ar6003_3.1_RC_Linux_release_[posted_2011_8_19_olca3.1RC_553/imx6build/host/os/linux/ar6000.o
從路徑中刪除它效果很好,我得到了我的核心模組目標文件。我改名了
ar6003_3.1_RC_Linux_release_[posted_2011_8_19_olca3.1RC_553
到
ar6003,
並且還測試了
ar6003_3.1_RC_Linux_release_posted_2011_8_19_olca3.1RC_553
兩者都工作得很好。我在 Ubuntu 10.04 上建構。我的一位同事在 Ubuntu 11.04 上的路徑中使用具有“[”字元的相同來源建構,並且核心模組目標文件建構良好,這也表明 grep / find / awk 或此類實用程序在不同版本中的行為發生了變化,正在使用哪個核心建構系統,導致此問題。
問候, Farrukh Arshad。