1

クロスコンパイルしようとしているサードパーティのデバイス ドライバがあります。ドライバーをビルドすると、すべてがスムーズに進みますが、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 の両方のファイルが表示されます。それでも、ドライバー モジュールをビルドできないのはなぜですか。

これがビルドの出力です。

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 で検索すると、誰かがこの問題に直面し、make を sudo で実行すると解決したと述べましたが、私には運がありませんでした!

カーネル構成に問題があるのでしょうか (つまり、ドライバーは、カーネルで有効にしていない構成設定を探していますが、その場合、必要な #define を探してコンパイラ エラーが発生するはずです)、もう 1 つのポイント私が理解しようとしているドライバービルドシステムに問題がある可能性があります。(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
4

1 に答える 1

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 またはそのようなユーティリティの動作が変更されたことも示唆しています。どのカーネル ビルド システムが使用しており、この問題が発生しています。

よろしく、Farrukh Arshad。

于 2012-12-18T11:00:00.020 に答える