繁体   English   中英

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

[英]Problems Compiling simple C program against custom Linux 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_INET,SOCK_STREAM,0)”替换为“ socket(AF_CUSTOM,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进行编译。 另外,这是我的第一个问题,我希望这是可以理解的。

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

本页包含有关此内容的更多信息: http : //headers.cross-lfs.org/

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

还要注意的另一件事是,从您的帖子中看来,您似乎希望在当前位置到处定义为当前内核定义的任何符号-并非如此。 每当您编译软件时,编译器就会看到与正在运行的内核无关的定义。 编译器仅知道如何搜索其包含路径以尝试查找您指定的标头,然后进行检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM