编译 Linux 内核时出现 xt_CONNMARK.h 错误

8

我试图编译Linux 2.6.32.6内核,并将几个模块嵌入内核,以实现一个非常特定的目的。我已经包含了NFS根文件系统,试图通过局域网PXE引导自己的定制救援Live-CD。在包含ROOT_NFS所需的依赖项和模块后,我尝试仅编译Linux内核使用make bzImage。然而,运行时出现错误。

make[4]: *** No rule to make target './linux-2.6.32.6/include/linux/netfilter/xt_CONNMARK.h', needed by './linux-2.6.32.6/usr/include/linux/netfilter/.install'. Stop.

我已经尝试在配置中禁用Netfilter模块,并尝试查找可能需要Netfilter的任何依赖项,但这个错误仍然持续发生。

如果有解决此错误的建议,将不胜感激。


你可能需要清理该文件的“depends”。kbuild 应该已经注意到了您更改了“.config”的事实,但是在这个较旧版本的Linux上可能没有。 - artless noise
首先执行 make clean 或手动删除 Makefile 的依赖信息。你的问题似乎非常熟悉,但我不记得具体是什么问题了。它可能与 make O=... 有关。 - artless noise
经过几次尝试,我在Kbuild中删除了特定的条目。然而,奇怪的是,xt_CONNMARK.h有两个条目。失败的一个全是大写字母,而另一个全是小写字母。遇到了几个类似的情况,但是一旦我移除了所有的事件(总共约5个),系统就成功编译和启动了。 - Blackninja543
@artlessnoise 你有没有想法为什么出现了这个问题?是故意为了其他事情吗? - Blackninja543
我曾经做了一些奇怪的事情,我切换了一个文件,手动编辑了 .config 或类似的东西。可能与编译器有关。 "C" 文件中包含 #include<xt_connmark.h>,文件名为 xt_CONNMARK.h 或类似的名称。很抱歉,我无法确定它,但我确实遇到了类似这个文件的问题。 依赖项是使用 gcc 自动生成的,因此它可能会创建一个混合大小写的依赖项规则,查看 #include 而不是实际打开的文件。 - artless noise
@Blackninja543 我知道这篇帖子已经很久了,但我遇到了同样的问题。如果我删除Makefile对缺少*.c文件的*.o文件的调用,问题就解决了吗? - Agent 0
1个回答

13
这很可能是因为你的源代码树丢失了一些文件,原因是通过不区分大小写的文件系统进行传输。在Linux源代码树中,大约有15个不同的文件在不同的时间命名相同但大小写不同。对于构建Linux内核的人来说,这通常不是问题,因为所有合理的文件系统都区分大小写。如果您好奇,这些文件都在netfilter树中 - 例如,在v3.0中,参见include/linux/netfilter/xt_CONNTRACK.h与include/linux/netfilter/xt_conntrack.h。
所以,这些文件确实存在,但已经丢失了。获取一个新的源代码树,在区分大小写的文件系统上解压缩它,您就不会再遇到这个错误了。或者,从“原始”的源代码树或内核的GitHub镜像复制文件,如果您担心丢失对树的修改-它们很可能在您编译的版本中没有更改。

即使我获取了Linux源代码并检出了v5.7版本,仍然存在这个问题。仍有一些文件丢失。 - Agent 0

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