交叉编译的内核模块 (ARM) 什么都不做

Cross-compiled kernel module (ARM) does nothing

前段时间开发了ARMv7(Cortex-A5)的内核模块。该模块运行良好,但我需要为其添加一项功能。不幸的是,安装了交叉编译器工具链的机器同时被改变了用途,所以我不得不重新设置它。当然,我发现我没有记录所有细节,而且我一直在努力获得一个可以实际加载的模块。大约一天后,我设法在目标上编译了被 insmod 接受的东西。

但是模块什么都不做。

insmod 没有给我任何错误。 dmesg 没有显示任何内容,尽管该模块应该从其探测例程中打印一些信息。另外,它应该创建的字符设备不存在,显然模块的探测例程不存在 运行.

如果我对旧 .ko(我仍然有)和新 .ko 都执行 modinfo,则没有区别。 file 也显示相同的输出,除了 sha1 校验和,这是预期的:

module_old.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=1f55850e8da4b3b5931536060d62193d94730cf6, not stripped
module_new.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=c3b1f6fdcb72381beb7b8a766c70af7a1252a78f, not stripped

我看到的唯一区别是新 .ko 比旧的大 10 倍:

-rw-r--r-- 1 root root 154504 Apr 21 23:38 module_new.ko
-rw-rw-r-- 1 root root  17956 Oct  4  2017 module_old.ko

我的Makefile如下:

obj-m += mymodule.o

KERNEL_SOURCE_DIR = /home/ludo/linux-at91-linux4sam_5.3

all:
        make -C $(KERNEL_SOURCE_DIR)  CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm M=$(PWD) modules

clean:
        make -C $(KERNEL_SOURCE_DIR)  CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm M=$(PWD) clean

我试过添加

CFLAGS_mymodule.o := -march=armv7-a -mtune=cortex-a5

但这没有什么区别。

我正在使用 gcc 4.9 在 Debian Jessie (8.10) 上构建。我不记得我用哪个 GCC 版本构建了旧版本,但它是 4.x,而不是更新的版本。

有什么办法可以调试这个问题吗?

我忘记记录构建过程中一个非常重要的步骤。在构建模块之前,需要确保配置是一致的。这可以通过从内核源代码树的根执行来完成:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- sama5_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules

然后就可以编译模块了,一切正常