Centos

編譯驅動程序時出現問題:“沒有製定目標的規則”

  • July 17, 2021

首先,我正在執行 CentOS 6.4 安裝。我的電腦是一台筆記型電腦,我正在嘗試為我的乙太網卡安裝驅動程序,因為這個週末我失去了連接到 Internet 的能力。

所以我下載了驅動程序: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'

我的makefile是:

   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

有什麼建議麼 ?

首要問題

你錯過了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-headerskernel-devel我們的核心版本。我們目前正在執行這個版本的核心:

$ uname -r
2.6.32-279.14.1.el6.x86_64

但是我們只是為這個版本安裝了kernel-headerskernel-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

引用自:https://unix.stackexchange.com/questions/75827