Buildroot 커널 모듈이 잘못된 모듈 형식을 보고합니다.

Buildroot 커널 모듈이 잘못된 모듈 형식을 보고합니다.

저는 Raspberry Pi 대상용 Buildroot에서 테스트 커널 모듈을 구축하고 있습니다. 내 호스트는 Ubuntu 22.04.1을 실행하는 x86입니다. 나는 다음을 포함하여 여러 튜토리얼을 따라 왔습니다.이것그리고이것그리고이것.

내 빌드루트 시스템이 부팅되고 어디에서나 컴파일된 커널 모듈을 볼 수 있습니다 /lib/modules/5.15.92-v7l/extra/kernelmoduletest.ko.xz.

내 홈 디렉토리에서 insmod를 실행하려고 하면 내 모듈을 찾을 수 없습니다. 그러나 설치된 위치로 이동하여 실행하면 insmod"잘못된 모듈 형식"이라는 메시지가 나타납니다.

# pwd
/root
# insmod kernelmoduletest.ko.xz 
insmod: can't insert 'kernelmoduletest.ko.xz': No such file or directory
# cd /lib/modules/5.15.92-v7l/extra/
# ls
dtbocfg.ko.xz           kernelmoduletest.ko.xz
# insmod kernelmoduletest.ko.xz 
insmod: can't insert 'kernelmoduletest.ko.xz': invalid module format

잘못된 모듈 형식 오류를 보면 커널 모듈이 잘못된 커널에 대해 컴파일되었음을 나타내는 것 같습니다.

더 많은 정보를 얻기 위해 dmesg를 실행했고 다음을 발견했습니다.

[    3.820114] udevd[136]: starting version 3.2.11
[    3.852896] udevd[137]: starting eudev-3.2.11
[    4.497392] bcmgenet fd580000.ethernet: configuring instance for external RGMII (RX delay)
[    4.507484] bcmgenet fd580000.ethernet eth0: Link is Down
[    8.635423] bcmgenet fd580000.ethernet eth0: Link is Up - 1Gbps/Full - flow control rx/tx
[   33.754917] cam-dummy-reg: disabling
[   66.809984] Invalid ELF header magic: != ELF
[   66.814488] Invalid ELF header magic: != ELF

insmod와 함께 실행될 수 있도록 모듈을 올바르게 컴파일하려면 어떻게 해야 합니까?


이것은 내 커널 모듈에 대한 설정 정보입니다.커널 모듈 테스트:

빌드루트/패키지/커널모듈테스트/Config.in:

config BR2_PACKAGE_KERNELMODULETEST
    bool "kernelmoduletest"
    help
        kernelmoduletest package.

        Kernel module test. Just a hello world package that runs as a kernel module.

빌드루트/패키지/kerneltestmodule/kernelmoduletest.mk:

################################################################################
#
# kernelmoduletest package
#
################################################################################

KERNELMODULETEST_VERSION = 1.0
KERNELMODULETEST_SITE = package/kernelmoduletest/src
KERNELMODULETEST_SITE_METHOD = local# Other methods like git,wget,scp,file etc. are also available.

#KERNELMODULETEST_MODULE_SUBDIRS = driver/base
KERNELMODULETEST_MAKE_OPTS = KVERSION=$(LINUX_VERSION_PROBED)



define KERNEL_MODULE_BUILD_CMDS
        $(MAKE) -C '$(@D)' LINUX_DIR='$(LINUX_DIR)' CC='$(TARGET_CC)' LD='$(TARGET_LD)' modules
endef


#ifeq ($(BR2_PACKAGE_LIBBAR),y)
#KERNELMODULETEST_DEPENDENCIES += libbar
#KERNELMODULETEST_CONF_OPTS += --enable_bar
#KERNELMODULETEST_MODULE_SUBDIRS += driver/bar
#else
#KERNELMODULETEST_CONF_OPTS += --disable_bar
#endif

$(eval $(kernel-module))
$(eval $(generic-package))

빌드루트/패키지/kerneltestmodule/src/kernelmoduletest.c:

#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");

static int myinit(void)
{
    printk(KERN_INFO "kernelmoduletest hello init\n");
    return 0;
}

static void myexit(void)
{
    printk(KERN_INFO "kernelmoduletest hello exit\n");
}

module_init(myinit)
module_exit(myexit)

빌드루트/패키지/kerneltestmodule/src/Makefile:

obj-m += kernelmoduletest.o
kernelmoduletest.o += -DDEBUG

all:
    #make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KDIR) M=$(PWD) modules
    $(MAKE) -C '/lib/modules/$(shell uname -r)/build' M='$(PWD)' modules

clean:
    #make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -C $(KDIR) M=$(PWD) clean
    $(MAKE) -C '$(LINUX_DIR)' M='$(PWD)' clean

답변1

먼저 모듈의 압축을 풀어야 합니다.

xz -d <module_path>

아니면 모듈을 압축하지 않고 커널을 빌드하세요.

make linux-nconfig

가다로드 가능한 모듈 지원 활성화->모듈 압축 방식그리고 선택전혀

지금모듈 삽입작동해야합니다. 도움이 되었기를 바랍니다.

관련 정보