2012-12-06 83 views
1

我有第三方設備驅動程序,我試圖交叉編譯。當我構建驅動程序時,一切都很順利,但是我沒有看到任何driver.ko文件,但是driver.o文件生成良好,並且在構建過程中沒有看到任何錯誤。我也試圖與選項V = 1,我看到下面的錯誤內核模塊不能編譯.ko文件

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/config/auto.conf文件包括/ generated/autoconf.h &。仍然爲什麼我無法構建我的驅動程序模塊。

這是構建的輸出。

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擺在首位。搜索谷歌有人也面臨這個問題,並提到與sudo運行make解決它,但它沒有帶給我運氣!

我徘徊是否有任何問題在我的內核配置(即驅動程序正在尋找一些配置設置,我沒有在我的內核啓用,但在這種情況下,它應該給編譯器錯誤尋找所需的#define)另一點可能是驅動程序構建系統存在問題,我試圖弄清楚。我的交叉編譯環境很好,因爲在爲我的(Ubuntu x86)機器構建相同的驅動程序時,我看到完全相同的問題!

任何想法。 關注Farrukh Arshad

更新#1 它的第三方驅動程序包,也建立其他實用程序以及驅動程序模塊。這裏是驅動模塊構建過程的輸出

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 
+0

你用什麼命令來構建?另外,如果您嘗試以root用戶身份進行構建,則可能會擁有root用戶所擁有的中間文件,您的普通用戶構建嘗試無法清除或覆蓋該文件。 –

+0

你的makefile看起來像......? –

回答

0

好吧,我已經找到了問題。我在模塊源目錄中有方括號字符「[」

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或其他實用程序在其內核構建系統正在使用的不同版本之間發生了變化,導致此問題。

Regards, Farrukh Arshad。