如何在没有内核Makefile的情况下编译Linux内核模块?

3

我有一台ARM架构的Linux设备,但没有内核的Makefile来构建内核模块。

我有针对这种架构的GCC交叉编译器。

如果没有内核的Makefile,我该如何编译一个内核模块?

1个回答

3
没有可用的内核Makefile,你无法编译内核模块。必须同时拥有预构建的内核源代码树和内核Makefile才能编译模块。在大多数发行版上,可以通过类似于“linux-headers-xxx”的软件包获取内核源代码以构建模块,“xxx”应该是“uname -r”的输出。
例如,在Debian或Ubuntu上:
sudo apt-get install linux-headers-$(uanme -r)

接下来您将在 /lib/modules/$(uname -r)/build 找到构建模块所需的文件,您可以使用类似于以下的Makefile 来构建模块:

KDIR  := /lib/modules/$(shell uname -r)/build
PWD   := $(shell pwd)
obj-m := mymodule.o     # same name as the .c file of your module

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules

这个命令实际上是调用内核的Makefile,告诉它在当前目录中构建模块。


此外,我不确定为什么你会说你正在使用ARM Linux设备,并且有一个交叉编译器。如果你在设备本身上,完全不需要交叉编译器。如果你在另一台设备上,则需要使用适当的 uname -r获取正确的源代码并进行构建。由于uname -r的输出并不总是有用的,你可能需要手动完成这个步骤。

你还需要在模块的Makefile中指定架构和交叉编译工具链前缀,例如:

default:
    $(MAKE) -C $(KDIR) M=$(PWD) ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- modules

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接