커널 모듈을 빌드할 때 인식되지 않는 명령줄 옵션 '-ftrivial-auto-var-init=zero'

커널 모듈을 빌드할 때 인식되지 않는 명령줄 옵션 '-ftrivial-auto-var-init=zero'

저는 커널 모듈 개발 경험이 거의 없습니다. 그럼에도 불구하고 저는 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
  • 배포판: 우분투 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이 CCmake 변수를 설정하여 DKMS가 환경 변수로 컴파일러를 적절하게 재정의하지 못하게 한다는 것 입니다 CC. 이 잠재적인 문제에 대한 설명은 다음과 같습니다.이 버그 보고서.

내 경우 Makefile은 CC사용자 수준 API 라이브러리를 빌드하기 위해 make 변수만 사용하기 때문에(즉, 모듈을 빌드하는 데 사용되는 Makefile의 일부에서는 사용되지 않음) 가장 좋은 해결책은 다음 /usr/src/의 복사본을 설치하는 것입니다. 전체 Makefile을 설치하는 대신 커널 모듈에 대한 부분 Makefile을 처리하세요.

답변3

심볼릭 링크를 (대신 ) /usr/bin/gcc으로 변경했습니다 .gcc-12gcc-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

관련 정보