编译针对自定义Linux内核的简单C程序的问题

时间:2013-05-14 22:43:06

标签: c linux networking gcc kernel

我最近编译了一个自定义内核,它定义了一个名为“AF_CUSTOM”的新地址族/协议族

这样,我的内核源代码中的include / linux / socket.h被更改了,如此处所示(以及PF_CUSTOM):

#define AF_NFC      39  /* NFC sockets          */
#define AF_CUSTOM       40  /* Custom sockets           */
#define AF_MAX      41  /* For now.. */

我计划实现AF_CUSTOM,但作为快速健全性检查,我决定修改一个典型的示例c套接字程序,看看是否用“socket(AF_CUSTOM,SOCK_STREAM,0)”替换“socket(AF_INET,SOCK_STREAM,0)”会编译,但它没有。 使用gcc编译时遇到以下错误:'AF_CUSTOM' undeclared 我认为它至少会编译,因为AF_CUSTOM应该在当前内核中定义。

我认为问题是gcc正在使用默认内核头来解析“#include< sys / socket.h>”而不是与当前正在运行的自定义内核对应的标头。我尝试在gcc上同时使用-I和-isystem选项将它引导到Ubuntu似乎为其他内核放置内核头的路径,因为它们似乎与我的Google研究相关,但它们没有帮助。

我的问题是:如何针对当前运行的自定义内核的头文件编译C程序,而不是默认的内核头文件。

我试过这个: gcc -isystem /usr/src/linux-headers-3.8.8-custom.5/ sendOnCustom.c -o sendOnCustom

仅供参考,使用make-kpkg编译。另外,这是我的第一个问题,我希望这是可以理解的。

1 个答案:

答案 0 :(得分:1)

Linux系统上的常见做法是使用Linux内核头文件的“已清理”副本来构建软件。可能,GCC正在寻找不在/ usr / src / linux中的头文件,但是在其他一些位置(可能是特定于发行版的 - 在我的机器上运行Gentoo,这些头文件放在/ usr / include /中) asm,/ usr / include / linux,...)。

此页面提供了有关此内容的更多信息:http://headers.cross-lfs.org/

我的猜测是,您需要确保在编译包含路径时包含/ usr / src / linux(或修改后的标头所在的位置),并且该行至少需要在其他清理之前出现标题,如果你不能完全省略它们。

另外需要注意的是,从您的帖子中,您似乎期望为当前内核定义的任何符号都可以在任何地方定义 - 事实并非如此。无论何时编译软件,编译器看到的定义都与正在运行的内核无关。编译器只知道如何搜索其包含路径以尝试查找您指定的标头,并检查它们。