私はカーネルモジュールの開発経験がほとんどありません。それにもかかわらず、私はSensoray 626 DAQカードの古いドライバを維持する任務を引き受けました。私は非常に単純なdkms設定を使ってドライバをビルドしてインストールしていますが、これは長い間うまくいきました。このドライバは、最近までカーネルモジュールのビルド中に次のエラーが発生し、解決策が見つからなくなるまでUbuntu 22.04で動作しました。助けてくれてありがとう。追加情報が必要な場合は、お問い合わせください。必要な情報で質問を更新します。
メモ:ComediにSensoray 626用のドライバがあることを知っています。 Comediドライバを使用したくありません。
DKMS ビルドログ:
DKMS make.log for s626-1.0.5 for kernel 6.5.0-14-generic (x86_64)
Fri Jan 12 01:17:52 PM PST 2024
make -C /lib/modules/6.5.0-14-generic/build M=/var/lib/dkms/s626/1.0.5/build SUBDIRS=/var/lib/dkms/s626/1.0.5/build
make[1]: Entering directory '/usr/src/linux-headers-6.5.0-14-generic'
warning: the compiler differs from the one used to build the kernel
The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
You are using: gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
CC [M] /var/lib/dkms/s626/1.0.5/build/s626drv.o
gcc: error: unrecognized command-line option ‘-ftrivial-auto-var-init=zero’
make[3]: *** [scripts/Makefile.build:251: /var/lib/dkms/s626/1.0.5/build/s626drv.o] Error 1
make[2]: *** [/usr/src/linux-headers-6.5.0-14-generic/Makefile:2037: /var/lib/dkms/s626/1.0.5/build] Error 2
make[1]: *** [Makefile:234: __sub-make] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.5.0-14-generic'
make: *** [Makefile:29: all] Error 2
- ディストリビューション:Ubuntu 22.04.3 LTS
- Linuxカーネルバージョン:6.5.0-14-generic
出力apt list --installed | grep gcc
gcc-11-base/jammy-updates,jammy-security,now 11.4.0-1ubuntu1~22.04 amd64 [installed,automatic]
gcc-11/jammy-updates,jammy-security,now 11.4.0-1ubuntu1~22.04 amd64 [installed,automatic]
gcc-12-base/jammy-updates,jammy-security,now 12.3.0-1ubuntu1~22.04 amd64 [installed,automatic]
gcc-12/jammy-updates,jammy-security,now 12.3.0-1ubuntu1~22.04 amd64 [installed,automatic]
gcc/jammy,now 4:11.2.0-1ubuntu1 amd64 [installed,automatic]
libgcc-11-dev/jammy-updates,jammy-security,now 11.4.0-1ubuntu1~22.04 amd64 [installed,automatic]
libgcc-12-dev/jammy-updates,jammy-security,now 12.3.0-1ubuntu1~22.04 amd64 [installed,automatic]
libgcc-s1/jammy-updates,jammy-security,now 12.3.0-1ubuntu1~22.04 amd64 [installed,automatic]
Makefile(このmakefileにはカーネルモジュール以外のもののレシピがあり、このCC
変数はカーネルモジュールを構築するためには使用されません):
###############################################################################
# for kernel modeule level driver:
# Kernel directory
KDIR := /lib/modules/$(shell uname -r)/build
# Module directory
MODDIR := /lib/modules/$(shell uname -r)/kernel/drivers/sensoray
# System values
PWD := $(shell pwd)
KERNEL_24 := $(if $(wildcard $(KDIR)/Rules.make),1,0)
# Target file
obj-m := s626.o
# Source files
ifeq ($(KERNEL_24),0) # > 2.4
s626-objs := s626drv.o
else # <= 2.4
s626-objs := s626drv.o
endif
.PHONY: all clean modules_install
ifeq ($(KERNEL_24),0) # > 2.4
ifeq ($(KERNELRELEASE),)
all:
$(MAKE) -C $(KDIR) M=$(PWD) SUBDIRS=$(PWD)
clean modules_install:
$(MAKE) -C $(KDIR) M=$(PWD) SUBDIRS=$(PWD) $@
endif # KERNELRELEASE
else # <= 2.4
ifneq ($(KERNELRELEASE),)
include $(KDIR)/Rules.make
s626.o: $(s626-objs)
$(Q)$(LD) $(LD_RFLAG) -r -o $@ $(s626-objs)
else
all:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -f *.ko *.o .*.cmd .*.o.flags *.mod.c
endif # KERNELRELEASE
endif # KERNEL_24
ifeq ($(KERNEL_24),1) # <= 2.4
install: s626.o
@if [ -d /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/ ];\
then rm -f /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/s626.*;\
fi
@if [ -d /lib/modules/$(shell uname -r)/extra/ ];\
then rm -f /lib/modules/$(shell uname -r)/extra/s626.*;\
fi
su -c "set -x;./MAKEDEV;mkdir -p $(MODDIR);cp -v s626.o $(MODDIR);depmod -a"
else
install: s626.ko
@if [ -d /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/ ];\
then rm -f /lib/modules/$(shell uname -r)/kernel/drivers/sensoray/s626.*; \
fi
@if [ -d /lib/modules/$(shell uname -r)/extra/ ];\
then rm -f /lib/modules/$(shell uname -r)/extra/s626.*;\
fi
@if [ -d /lib/modules/$(shell uname -r)/kernel/drivers/staging/comedi/drivers ];\
then rm -f /lib/modules/$(shell uname -r)/kernel/drivers/staging/comedi/drivers/s626.*;\
fi
su -c "set -x;./MAKEDEV;mkdir -p $(MODDIR);cp -v s626.ko $(MODDIR);install -m 444 s626.ko $(MODDIR);depmod -a"
endif # KERNEL > 2.4
###############################################################################
# for library and application level:
SRC= # module source tree
CC= # compiler
AR= # library manager
# source path
ifeq ($(strip $(SRC)),)
SRC=.
endif
# the compiler
ifeq ($(strip $(CC)),)
CC=gcc
endif
# the library manager
ifeq ($(strip $(AR)),)
AR=ar
endif
# build the distribution's library
lib: libs626.a
libs626.a: s626core.o s626mod.o
$(AR) cr libs626.a $(SRC)/s626core.o $(SRC)/s626mod.o
# compile the 626 universal core
core: s626core.o
s626core.o: $(SRC)/s626core.c $(SRC)/s626core.h $(SRC)/s626mod.h
$(CC) $(CFLAGS) -c $(SRC)/s626core.c
# build the 626 OS-dependent module
mod: s626mod.o
s626mod.o: $(SRC)/s626mod.c $(SRC)/s626core.h $(SRC)/s626mod.h $(SRC)/s626drv.h $(SRC)/s626.h $(SRC)/s626api.h
$(CC) $(CFLAGS) -c $(SRC)/s626mod.c
# build the distribution's library (you may need to install gcc-multilib package)
lib32: libs626-32.a
libs626-32.a: s626core-32.o s626mod-32.o
$(AR) cr libs626-32.a $(SRC)/s626core-32.o $(SRC)/s626mod-32.o
# compile the 626 universal core
s626core-32.o: $(SRC)/s626core.c $(SRC)/s626core.h $(SRC)/s626mod.h
$(CC) $(CFLAGS) -m32 -c $(SRC)/s626core.c -o $@
# build the 626 OS-dependent module
s626mod-32.o: $(SRC)/s626mod.c $(SRC)/s626core.h $(SRC)/s626mod.h $(SRC)/s626drv.h $(SRC)/s626.h $(SRC)/s626api.h
$(CC) $(CFLAGS) -m32 -c $(SRC)/s626mod.c -o $@
#----------------------------------------------------------------
# Demonstration programs
# type "make demo" to compile, link, and create demo application
demo: libs626.a s626demo.o s626dm2b.o
$(CC) -o s626demo s626demo.o -L$(SRC) -ls626 -lpthread
$(CC) -o s626dm2b s626dm2b.o -L$(SRC) -ls626 -lpthread
s626demo.o: $(SRC)/s626demo.c $(SRC)/s626core.h $(SRC)/s626mod.h $(SRC)/s626drv.h $(SRC)/s626api.h $(SRC)/App626.h
$(CC) $(CFLAGS) -c $(SRC)/s626demo.c
s626dm2b.o: $(SRC)/s626dm2b.c $(SRC)/s626core.h $(SRC)/s626mod.h $(SRC)/s626drv.h $(SRC)/s626api.h $(SRC)/App626.h
$(CC) $(CFLAGS) -c $(SRC)/s626dm2b.c
demo32: libs626-32.a s626demo-32.o s626dm2b-32.o
$(CC) -m32 -o s626demo-32 s626demo-32.o -L$(SRC) -ls626-32 -lpthread
$(CC) -m32 -o s626dm2b-32 s626dm2b-32.o -L$(SRC) -ls626-32 -lpthread
s626demo-32.o: $(SRC)/s626demo.c $(SRC)/s626core.h $(SRC)/s626mod.h $(SRC)/s626drv.h $(SRC)/s626api.h $(SRC)/App626.h
$(CC) $(CFLAGS) -m32 -c $(SRC)/s626demo.c -o $@
s626dm2b-32.o: $(SRC)/s626dm2b.c $(SRC)/s626core.h $(SRC)/s626mod.h $(SRC)/s626drv.h $(SRC)/s626api.h $(SRC)/App626.h
$(CC) $(CFLAGS) -m32 -c $(SRC)/s626dm2b.c -o $@
# for debugging:
# gcc -g -o s626demo s626core.c s626mod.c s626demo.c -lpthread
# gcc -g -o s626dm2b s626core.c s626mod.c s626dm2b.c -lpthread
clnall:
rm -f *.ko *.o .*.cmd .*.o.flags *.mod.c libs626*.a s626demo s626dm2b *.tar.gz s626*-32 Module.symvers modules.order
###############################################################################
# for internal develoment only
#----------------------------------------------------------------
# select files for the distribution tarball
T = $(SRC)/README
T += $(SRC)/COPYING
T += $(SRC)/MAKEDEV
T += $(SRC)/Modules.conf
T += $(SRC)/Makefile
T += $(SRC)/s626drv.h
T += $(SRC)/s626drv.c
T += $(SRC)/s626.h
T += $(SRC)/s626mod.h
T += $(SRC)/s626mod.c
T += $(SRC)/s626core.h
T += $(SRC)/s626core.c
T += $(SRC)/s626api.h
T += $(SRC)/App626.h
T += $(SRC)/libs626.a
T += $(SRC)/s626demo.c
T += $(SRC)/s626dm2b.c
#----------------------------------------------------------------
# build distribution tarball (only for development)
tar:
# tar -Pzcf s626-0.3.tar.gz $(T)
tar -czvf s626-1.0.tar.gz $(T)
DKMS 構成ファイル:
MAKE="'make' KDIR=/lib/modules/${kernelver}/build"
CLEAN="'make' clean"
BUILT_MODULE_NAME=s626
BUILT_MODULE_LOCATION=./
DEST_MODULE_LOCATION=/kernel/drivers/sensoray/
PACKAGE_NAME=s626
PACKAGE_VERSION=1.0.5
AUTOINSTALL=yes
REMAKE_INITRD=yes
答え1
同じ質問。私のシステムはUbuntu 23.10で、デフォルトのgcc / g ++バージョンは13です。 CUDA 11.8のインストール中にgcc / g ++バージョン11に切り替えました。
バージョンオプションをインストールしようとしましたupdate-alternatives
。
gcc-13とg++-13に戻すことで問題を解決しました。
答え2
問題は、元の開発者が作成したMakefileがCC
make変数を設定し、DKMSがコンパイラを環境変数として適切にオーバーライドできないことですCC
。この潜在的な問題の説明は次のとおりです。このバグレポート。
私の場合、MakefileはCC
ユーザーレベルのAPIライブラリを構築するためにmake変数のみを使用するため(つまり、モジュールの構築に使用されるMakefileの一部では使用されません)、最善の解決策は次/usr/src/
のコピーをインストールすることです。完全なMakefileをインストールするのではなく、カーネルモジュールの部分的なMakefileを処理してください。
答え3
シンボリックリンクを(代わりに)/usr/bin/gcc
に変更しました。gcc-12
gcc-11
そして走るsudo /sbin/vboxconfig
vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
(Ubuntu 22.04.3 LTS、5.19.17-051917-Universal Kernelを使用)
答え4
このユーザーに敬意を表しますハカンツ@これ並行フォーラムこれはこのgccバージョンの問題に対する有効なソリューションです。 gcc-12を指すようにリンクを変更します。
cd /usr/bin
sudo ln -sf gcc-12 gcc
sudo ln -sf gcc-ar-12 gcc-ar
sudo ln -sf gcc-nm-12 gcc-nm
sudo ln -sf gcc-ranlib-12 gcc-ranlib
sudo rm /usr/lib/parallels-tools
sudo rm /var/lib/parallel-tools
マウントディレクトリ
cd "/media/YOUR_USER_NAME_HERE/Parallels Tools"
またはマウントされているマウントディレクトリに移動します。
最後にやり直してください。
sudo ./install