压缩模块时,armv7l 的模块 makefile 失败

压缩模块时,armv7l 的模块 makefile 失败

我使用 netfilter 编写了一个网络钩子。该模块在我的 ubuntu 16.04 上编译成功。

现在我想在我的嵌入式板中编译它,该板使用定制的 Linux,并在我的笔记本电脑中使用相同版本的内核。唯一的问题是我的嵌入式板中的所有模块都已.ko.xz格式化,并且我的 makefile 失败,我不知道如何解决该问题。

我原来的makefile是:

obj-m += sysfirewall.o
all:
    make -C  /lib/modules/$(shell uname -r)/build -I/usr/Include/ M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build -I/usr/Include/ M=$(PWD) clean

但这失败了,因为我在嵌入式 Linux 中找不到任何构建文件夹。有一个内核文件夹而不是构建文件夹,我将其替换为内核。

现在我的 makefile 是:

obj-m += sysfirewall.o
all:
    make -C  /lib/modules/$(shell uname -r)/kernel -I/usr/Include/ M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/kernel -I/usr/Include/ M=$(PWD) clean

但是当我在当前目录中运行 make 时,会出现以下错误:

$ make -C  /lib/modules/4.14.49-ti-r54/kernel -I/usr/Include/ M=/home/parsa/firewall/ modules
make[1]: Entering directory '/lib/modules/4.14.49-ti-r54/kernel'
make[1]: *** No rule to make target 'modules'.  Stop.
make[1]: Leaving directory '/lib/modules/4.14.49-ti-r54/kernel'9-ti-r54/uname -i 
Makefile:3: recipe for target 'all' failed
make: *** [all] Error 2

我怎么解决这个问题?我应该解压缩内核中的所有模块吗?这真的是压缩的 Linux 内核模块的问题还是错误显示了其他内容?

PS:我不想在我的笔记本电脑中交叉编译该模块。

编辑:我注意到“/lib/modules/$(shell uname -r)/kernel”文件夹中应该有一个 Makefile,该文件夹不在我的嵌入式板中。我在笔记本电脑的“/lib/modules/$(shell uname -r)/build”文件夹中跟踪了 Make 文件,并意识到它是到 /usr/src/linux-headers-4.4.0-128/Makefile 的软链接。但我的嵌入式板的 /usr/src 中没有任何内容。所以我想我必须找到一个 make 文件才能编译这个模块,但我不知道如何!

答案1

问题不在于压缩,而在于make找不到正确的文件。注意make命令是进入/lib/modules/<kernel version>/kernel目录,然后才报错。所以它在那里找不到它需要的任何东西。

您不能替换/lib/modules/<kernel version>/kernel/lib/modules/<kernel version>/build:它们的内容不同。该kernel目录包含该特定内核版本附带的已编译模块。这对命令根本没有帮助:它需要内核源代码附带的makemakefile 和文件。.h其中一些是作为主内核编译的一部分动态生成的。

通常,它/lib/modules/<kernel version>/build是一个符号链接,指向与该特定内核版本关联的内核头所在的位置。如果您的嵌入式主板使用以“Debian方式”编译的内核(即make bindeb-pkg在内核源目录中具有或类似的内核),则内核编译过程应该生成许多.deb包:

  • linux-image-<version>_<patchversion>_<architecture>.deb= 实际编译的内核及其模块
  • linux-headers-<version>_<patchversion>_<architecture>.deb= 为该特定内核编译更多内核模块所需的标头

在这种情况下,您只需找到并安装与linux-headers您在 ARM 板上使用的确切内核版本相对应的软件包。它会自动/lib/modules/<kernel version>/build为您提供链接。

如果您使用传统或类似的方式编译了自己的自定义内核make bzimage,那么您必须/lib/modules/<kernel version>/build自己提供链接。如果实际的内核构建目录仍然可用,只需将其链接到/lib/modules/<kernel version>/build.

相关内容