【问题标题】:How to determine which version of a kernel header file is used in a particular build [closed]如何确定在特定构建中使用哪个版本的内核头文件[关闭]
【发布时间】:2012-10-11 20:34:54
【问题描述】:

我正在尝试了解 Linux 内核,所以我正在阅读 Linux 内核源代码。那么如何确定头文件的位置,因为有很多头文件同名但位于不同的目录中?

示例:它们在 fs/open.c 中包含 fcntl.h

我可以在 17 个不同的目录中找到 fcntl.h

arch/alpha/include/asm/fcntl.h
arch/arm/include/asm/fcntl.h
....

【问题讨论】:

  • 您列出的示例对于各种类型的处理器都是独一无二的,可能只有其中一个(或最多两个)可能会被给定硬件的构建使用。然而,也可能存在其他可能性,有时很难确定使用哪个 - 例如,将有一个带有 C 库的派生副本,供用户空间程序链接,该副本将匹配架构中特定于架构的细节。内核源代码。
  • 如果您礼貌地询问大多数编译器,他们会告诉您他们在哪里搜索。 gcc --verbose 我认为是这样的。
  • 这绝对是一个真实的问题,涵盖了一个真实且常见的问题。只能假设那些关闭它的人从未尝试过修改内核模块。

标签: c linux build linux-kernel header-files


【解决方案1】:

一般来说,这将取决于文件是included 的方式。如果包含这样的引号:

#include "QuotedHeader.h"

应该在同一个目录中。 (它也可以在“包含”目录中。)
如果包含在这样的尖括号中:

#include <BracketedHeader.h>

它位于“包含”目录中。这些是编译器在编译时被告知搜索头文件的目录。这些可以作为参数传递,也可以在环境变量中设置。

对于提供的示例,目录清楚地说明了为什么存在重复:通常,不同的体系结构特定文件由以不同 architectures 命名的文件夹分隔。
在提供的示例中,您正在查看 AlphaARM 架构的不同 fcntl.h 文件。编译器将使用的文件取决于正在编译的 CPU,并且编译器将被告知在编译期间使用哪个文件。

在我个人看来,如果你还不知道这一点,那么你可能是从错误的地方开始理解 linux 内核。尝试先研究 C

【讨论】:

  • 我绝对同意个人意见。内核源代码相当复杂,在敢于深入研究之前,您应该对 C 编程非常流利。首先尝试了解一些应用程序(例如你的 shell 的源代码)是如何编译的,以及它的源代码是如何设计的。另请阅读advancedlinuxprogramming.com 或其他好书。
【解决方案2】:

您可以将preprocessor options 添加到控制内核模块编译的CFLAGS。特别是,-H 选项(传递给gcc)显示每个#include-d 标头的路径,-I 选项扩充了搜索的包含目录列表。

【讨论】:

    【解决方案3】:

    在手册页中查找头文件的名称......或谷歌它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-19
      • 2017-06-16
      • 1970-01-01
      • 2018-11-27
      • 2015-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多