【发布时间】:2020-05-08 00:38:03
【问题描述】:
我有一个 ARM Linux 设备,但我没有内核的 Makefile 来构建内核模块。
我有这个拱门的 GCC 交叉编译器。
如果没有内核的Makefile,如何编译内核模块?
【问题讨论】:
标签: linux gcc linux-kernel cross-compiling kernel-module
我有一个 ARM Linux 设备,但我没有内核的 Makefile 来构建内核模块。
我有这个拱门的 GCC 交叉编译器。
如果没有内核的Makefile,如何编译内核模块?
【问题讨论】:
标签: linux gcc linux-kernel cross-compiling kernel-module
没有内核的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
【讨论】: