2014-01-17 78 views
0

我正在读取内核的源文件并且有一些问题:编译内核时编译器使用哪个头文件路径?

1)编译内核时编译器使用哪个头文件路径? 在源文件树中,我找到了一个名为'include'的目录。 但是,在'/ usr/include /'中,我也可以找到一些内核头文件。 编译器使用哪一个? 2)某些文件包含这样的头文件:'#include', 但我在源树 和'/ usr/include /'下找不到任何名为'asm'的目录,但是,他们有名为'asm_generic'的目录。 当我使用命令'make headers_install'时,生成的文件包含'asm' 编译内核的过程是否首先安装头文件? 并强制编译器来处理它们?

p.s.我想将内核的源文件转换为调用者 - 被调用者图来做一些研究。所以我需要一些静态分析工具。我确实尝试了'call-tree',但结果充满了错误,您能否介绍一些更强大的工具?

+0

欢迎来到SO。请一次只提出一个问题,否则您完全破坏本网站的目标是成为可搜索的知识库。您可以轻松编辑您的问题,将其减少为一个干净的单个问题,然后最终在单独的线索中询问其他人。 –

+0

使用源树中的副本。/usr/include中的文件被提取出来,用于用户模式程序的导出版本,该程序可以与内核进行链接。 asm /目录是特定于平台的,而内核源代码是不可知的,所以构建过程将指向与正在构建的配置相对应的特定目录。你可能会发现'find'和'grep -r'命令在你的探索中很有趣...... –

+0

Linux内核是“自我内容”,它不依赖于任何库。这意味着内核源代码中引用的所有头文件也是内核的一部分。 –

回答

1

运行make与参数V=1,您将看到传递给gcc和其他程序的确切行。这将告诉你到底发生了什么(从而回答你的两个问题)。但是,回答(2),没有make不安装任何标题,它只是将-I参数的包含路径设置为gcc

+1

也有帮助的是[kbuild文档](https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/kbuild),特别是[makefiles.txt](https: //git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/kbuild/makefiles.txt)。一般来说,有三组。一般的Linux,* include/*,architechure,* arch/arm/include *和machine * arch/arm/mach-davinci *。这些包括依赖于'.config'文件。有些是** API **。 [稀疏工具](https://sparse.wiki.kernel.org/index.php/Main_Page)将是一个很好的开始,它会检查** API **。 –