업데이트 #1

업데이트 #1

크로스 컴파일하려는 타사 장치 드라이버가 있습니다. 드라이버를 빌드할 때 모든 것이 잘 진행되지만 드라이버.ko 파일은 표시되지 않지만 드라이버.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.hinclude/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를 받지 못했느냐는 것입니다. 인터넷 검색 후 누군가 이 문제에 직면하여 sudo로 make를 실행하면 문제가 해결되었다고 언급했지만 아무런 행운도 얻지 못했습니다!

커널 구성에 문제가 있는지 궁금합니다. 즉, 드라이버가 아직 커널에서 활성화하지 않은 일부 구성 설정을 찾고 있지만 이 경우 필수 #define을 찾는 컴파일러 오류가 발생해야 합니다. , 또 다른 점은 드라이버 빌드 시스템에 문제가 있을 수 있습니다. 알아내려고 노력 중입니다. 내 (Ubuntu x86) 컴퓨터에 대해 동일한 드라이버를 빌드할 때 똑같은 문제가 발생하므로 내 크로스 컴파일 환경은 괜찮습니다!

업데이트 #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

답변1

좋아, 문제를 발견했습니다. 모듈 소스 디렉토리에 대괄호 문자 "["가 있습니다.

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

둘 다 아주 잘 작동합니다. 우분투 10.04를 기반으로 구축 중입니다. 내 동료가 Ubuntu 11.04의 경로에 "[" 문자가 있는 동일한 소스와 커널 모듈 객체 파일이 잘 빌드되어 있는데, 이는 또한 grep/find/awk 또는 그러한 유틸리티가 다른 버전에 있음을 시사합니다. 시스템을 구축하는 데 사용된 커널의 동작으로 인해 문제가 발생했습니다.

감사합니다, Farooq Arshad.

관련 정보