新内核

时间:2015-08-10 07:03:15

标签: c linux linux-kernel

我安装了Fedora 22,它有默认的内核4.0.4。 但我需要内核4.1.4,所以我在Fedora 22上安装了内核4.1.4,并在grub中为新内核创建了一个条目。

内核4.1.4已成功安装,我可以使用新内核登录。

输出" uname -a" -

uname -a
Linux localhost.localdomain 4.1.4 #1 SMP Fri Aug 7 10:52:36 EDT 2015 x86_64 x86_64 x86_64 GNU/Linux

新内核的路径 -

/usr/src/linux-4.1.4

包含文件夹的路径 -

/usr/src/linux-4.1.4/include

现在我写了一个C程序,它使用宏AF_MPLS,它在新的内核头文件中定义。编译c程序失败,因为AF_MPLS不在/usr/include/sys/socket.h中。

发现错误 -

RouteMPLS.c: In function âroute_addâ:
RouteMPLS.c:212:24: error: âAF_MPLSâ undeclared (first use in this function)
req.r.rtm_family = AF_MPLS;

RouteMPLS.c中使用的标头文件

#include <stdio.h>
#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <errno.h>

因此,我将头文件a / c的位置更改为新内核 -

#include "/usr/src/linux-4.1.4/include/linux/socket.h"

仍然会抛出编译错误,然后我尝试了

gcc RouteMPLS.c -I /usr/src/linux-4.1.4/include/
In file included from /usr/src/linux-4.1.4/include/linux/kernel.h:6:0,
             from /usr/src/linux-4.1.4/include/linux/skbuff.h:17,
             from /usr/src/linux-4.1.4/include/linux/netlink.h:6,
             from RouteMPLS.c:3:
/usr/src/linux-4.1.4/include/linux/linkage.h:7:25: fatal error: asm/linkage.h: No such file or directory

编译终止。

请指导我如何使用新的内核头文件安装我们的c程序 -

默认内核头位置 -

/usr/include

新内核标头位置 -

/usr/src/linux-4.1.4/include

提前致谢。

1 个答案:

答案 0 :(得分:2)

问题是你在内核编译目录中有linux内核4.1.4头文件。

为了编译用户程序,编译器通常在/usr/include中查找它们(好吧,在新的体系结构中,它有些复杂)并且通常是运行的内核头文件的副本内核安装在/usr/include

但是现在,你的内核头文件版本不匹配。你不知道你从哪里下载了这些源代码,但是在内核源代码树的Documentation子目录中,你有一些文档解释了如何在适当的位置安装内核头文件,所以编译器为系统应用程序找到它们。

/usr/src/linux-4.1.4/Documentation阅读文档,找一个解释如何在适当的位置安装内核头文件的文件。主要是指它在/usr/include/linux/usr/include/asm和(根据您的情况)/usr/include/asm-amd64下安装的所有文件。

注意:

在内核源代码树中进行了一些搜索之后,我在Makefile中找到了一个目标headers_install(通过尝试make help)我想用来将内核树中的头文件安装到适当的位置

因此,安装内核头文件的最可能方法是:

make headers_install

或(如果您必须将它们安装在其他地方)

INSTALL_HDR_PATH=<new_path> make headers_install

(默认情况下安装会转到./usr