2012-12-06 33 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。