드라이버 컴파일 중 문제 발생: "대상 생성 규칙이 없습니다."

드라이버 컴파일 중 문제 발생: "대상 생성 규칙이 없습니다."

먼저 CentOS 6.4 설치를 실행하고 있습니다. 내 컴퓨터는 노트북이고 이번 주말에 인터넷에 연결할 수 없어 이더넷 카드용 드라이버를 설치하려고 합니다.

그래서 드라이버를 다운로드했습니다: jmebp-1.0.8.5

gcc, kernel-devel을 설치했는데 작동하지 않아서 결국 그룹 개발 도구를 설치하게 되었습니다(잊은 것이 있을 경우를 대비해).

내가

make install

다음 오류가 발생합니다.

*** No rule to make target `internet/jmebp-1.0.8.5'.  Stop.
Leaving directory `/lib/modules/2.6.32-358.6.1.el6.x86_64/build'

내 빌드 파일은 다음과 같습니다

    MODNAME := jme
obj-m := $(MODNAME).o

ifneq ($(KERNELRELEASE),)
#########################
# kbuild part of makefile
#########################
EXTRA_CFLAGS += -Wall -O3
#EXTRA_CFLAGS += -DTX_DEBUG
#EXTRA_CFLAGS += -DREG_DEBUG

else
#########################
# Normal Makefile
#########################
TEMPFILES := $(MODNAME).o $(MODNAME).mod.c $(MODNAME).mod.o Module.symvers .$(MODNAME).*.cmd .tmp_versions modules.order Module.markers Modules.symvers

ifeq (,$(KVER))
KVER=$(shell uname -r)
endif
KSRC ?= /lib/modules/$(KVER)/build
MINSTDIR ?= /lib/modules/$(KVER)/kernel/drivers/net

all: modules
    @rm -rf $(TEMPFILES)
modules:
    @$(MAKE) -C $(KSRC) M=$(shell pwd) modules

checkstack: modules
    objdump -d $(obj-m) | perl $(KSRC)/scripts/checkstack.pl $(shell uname -m)
    @rm -rf $(TEMPFILES)

namespacecheck: modules
    perl $(KSRC)/scripts/namespace.pl
    @rm -rf $(TEMPFILES)

install: modules
    install -m 644 $(MODNAME).ko $(MINSTDIR)
    depmod -a $(KVER)

patch:
    @/usr/bin/diff -uar -X dontdiff ../../trunc ./ > bc.patch || echo > /dev/null

buildtest:
    SRCDIRS=`find ~/linux-src -mindepth 1 -maxdepth 1 -type d -name 'linux-*' | sort -r -n`; \
    SRCDIRS="$${SRCDIRS} `find ~/linux-src/centos -mindepth 2 -maxdepth 2 -type d -name 'linux-*' | sort -r -n`"; \
    SRCDIRS="$${SRCDIRS} `find ~/linux-src/fedora -mindepth 2 -maxdepth 2 -type d -name 'linux-*' | sort -r -n`"; \
    for d in $${SRCDIRS}; do \
        $(MAKE) clean && $(MAKE) -C . KSRC=$${d} modules; \
        if [ $$? != 0 ]; then \
            exit $$?; \
        fi; \
    done
    $(MAKE) clean

clean:
    @rm -rf $(MODNAME).ko $(TEMPFILES)

%::
    $(MAKE) -C $(KSRC) M=`pwd` $@

endif

어떤 제안이 있으십니까?

답변1

주요 문제

kernel-headers패키지를 분실하셨습니다 . 커널 모듈을 컴파일하려면 이것이 필요합니다.

yum install kernel-headers

가설드라이버를 다운로드하는 곳입니다에서. CentOS 6.4 시스템에서 압축을 풀면 다음 오류가 발생합니다.

$ cd jmebp-1.0.8.5
$ ls
CHANGELOG  jme.c  jme.h  Makefile  scripts
$ make
make: *** /lib/modules/2.6.32-279.14.1.el6.x86_64/build: No such file or directory.  Stop.
make: *** [modules] Error 2

kernel-headers패키지를 설치 한 후 make두 번째로 실행했습니다.

$ make
make: *** /lib/modules/2.6.32-279.14.1.el6.x86_64/build: No such file or directory.  Stop.
make: *** [modules] Error 2

다른 질문 있나요? 추가로 디버깅하면서 여러분이 직면할 수 있는 또 다른 문제를 발견했기 때문에 만일을 대비해 아래에 문서화했습니다.

두 번째 용어

커널 디렉토리의 링크가 손상된 것 같습니다.

$ pwd
/lib/modules/2.6.32-279.14.1.el6.x86_64

$ ls -l | grep build
lrwxrwxrwx  1 root root     51 Dec 15 14:49 build -> ../../../usr/src/kernels/2.6.32-279.14.1.el6.x86_64
lrwxrwxrwx  1 root root      5 Dec 15 14:50 source -> build

$ ls -l build/
ls: cannot access build/: No such file or directory

kernel-headers이런, 잘못된 커널 버전과 잘못된 버전이 있습니다 kernel-devel. 현재 다음 버전의 커널을 실행하고 있습니다.

$ uname -r
2.6.32-279.14.1.el6.x86_64

하지만 방금 해당 버전의 kernel-headers및 패키지를 설치했습니다.kernel-devel

2.6.32-358.6.1.el6.x86_64

따라서 해당 버전의 커널도 설치하고 재부팅하여 최신 커널을 사용할 수 있도록 하겠습니다.

$ yum update kernel

다시 시작하면 모든 것이 훨씬 좋아 보입니다.

$ ls
CHANGELOG  jme.c  jme.h  Makefile  scripts

$ make
make[1]: Entering directory `/usr/src/kernels/2.6.32-358.6.1.el6.x86_64'
  CC [M]  /home/sam/jmebp/jmebp-1.0.8.5/jme.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/sam/jmebp/jmebp-1.0.8.5/jme.mod.o
  LD [M]  /home/sam/jmebp/jmebp-1.0.8.5/jme.ko.unsigned
  NO SIGN [M] /home/sam/jmebp/jmebp-1.0.8.5/jme.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-358.6.1.el6.x86_64'

$ ls
CHANGELOG  jme.c  jme.h  jme.ko  jme.ko.unsigned  Makefile  scripts

이제 jme.ko 커널 모듈이 보입니다. 설치하려면:

make install

관련 정보