交叉编译的内核模块 (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
然后就可以编译模块了,一切正常
前段时间开发了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
然后就可以编译模块了,一切正常