安装内核头文件而不覆盖旧头文件

安装内核头文件而不覆盖旧头文件

我已经构建了一个运行良好的较新(3.16-rc2)内核。我的用户空间程序需要链接到较新的标头,因为它使用 fcntrl.h 等中的一些新定义。

我的问题是在运行“make headers_install”时如何保留旧内核的标头?

如果运行

make headers_install INSTALL_HDR_PATH=/usr/src/kernels/`uname -r` 

标头定义发生冲突,因为 /usr/src/include 仍在 PATH 中。

处理这个问题的正确方法是什么?

答案1

您不能使用#include相同路径的两个标头,但您可以在正常路径之外安装一个标头,并在使用适当的开关(对于 gcc,-I)进行编译时让它取代那些标头。我想你已经明白了这一点,所以如果你asm/fcntl.h在正常的包含目录中放置了多个目录,那么你不需要太多的思考就能认识到这一点,无论如何,只有其中之一适用

不过,我认为你不必担心太多。从您的一些评论开始:

用户空间程序中使用较新内核机制的那些功能可以被禁用。

这很好。如果您#define NEWVALUE 666需要编译,这涉及到一个仅适用于较新内核的功能,您可以捕获或禁用此类功能,否则,实际应用的部分NEWVALUE将永远不会被调用。请记住,并不是说在旧内核运行时没有定义可用的标头——即使有,也没关系,因为运行时的真正问题是您实际上调用了内核中不存在的部分。核心ABI。您根本不需要任何标头跑步一个可执行文件,因此回到旧内核对此并不重要。

也许我有点偏执,但是……

是和不是。如果这是一个系统,其中不同的人任意交换不同的内核头文件,以便在编译将留下的内容并稍后使用旧内核运行时利用新功能,那么偏执是一个适当的反应,哈哈。然而,真正属于这一类的东西可能并不多。

发行版在每次升级时都会替换内核头文件,但是它们必须同时替换的用户空间列表通常看起来并没有那么长(如果它存在的话)。我想这部分是因为在这种情况下保持向后兼容性非常容易,但我认为这也是因为这种情况下的事情不会随着时间的推移而发生巨大变化。

我想我可以保存旧的标题并重新安装它们。

您可以这样做,也可以在需要时从适当的来源替换它们 ( make headers_install);如果它是发行版内核并且您担心它们可能会被修补,那么该发行版应该有一个源代码包。

相关内容