1

我最近编译了一个自定义内核,它定义了一个名为“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 编译。另外,这是我的第一个问题,希望可以理解。

4

1 回答 1

1

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

这个页面有更多关于这个的信息:http: //headers.cross-lfs.org/

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

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

于 2013-05-14T22:52:51.427 回答