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

时间:2017-12-14 20:59:03

标签: gcc linux-kernel arm kernel-module

前段时间,我为ARMv7(Cortex-A5)开发了一个内核模块。这个模块工作正常,但我需要添加一个功能。不幸的是,安装了交叉编译工具链的机器在同一时间重新调整用途,所以我不得不重新设置它。当然,我发现我没有记录所有的细节,我一直在努力获得一个实际加载的模块。大约一天后,我设法编译了目标上insmod接受的内容。

但该模块什么都不做。

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

如果我对旧modinfo(我仍有)和新.ko.ko,则没有差异。除了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比旧版-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 大10倍:

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

我的Makefile如下:

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

我尝试添加

select OrderDay = datepart(dayofweek, soh.OrderDate) 
    , sum(sod.LineTotal)
    , SUM(sod.OrderQty)
from sales.SalesOrderDetail sod
join sales.SalesOrderHeader soh on sod.SalesOrderID = soh.SalesOrderID
group by datepart(dayofweek, soh.OrderDate)

但这没有任何区别。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

然后可以编译模块,一切都很好。