编译2.4.20-8版本linux内核后,头文件interrupt.h和smplock.h出现依赖循环

简介:

 带源码安装linux版本2.4.20-8后,源码位于/usr/src/linux-2.4.20-8/中,重新编译源码:

make mrproper

make oldconfig

make bzImage//生成核心

make modules //生成核心模块

 关于内核编译相关知识请参考<<鸟哥的私房菜>>第三版26章"linux核心编译于管理".


 完成后会在/usr/src/linux-2.4.20-8/中出现一个tmp_include_depends文件,这是一个指出头文件相互依赖的文件,观察一下这个文件中的内容发现,头文件在/usr/src/build/231485-i386/install/usr/src/linux-2.4.20-8/中,但实际上/usr/src/build/是空目录,不知道"/usr/src/build/231485-i386/install"是如何生成的,也许是makefile的错误.解决办法是可以创建这样一个路径/usr/src/build/231485-i386/install/usr/src/,将linux-2.4.20-8目录拷贝进去.不过这样太麻烦,也可修改tmp_include_depends all,将"/usr/src/build/231485-i386/install"全部删除,然后执行命令:

make -r -f tmp_include_depends all

会出现错误:

make[2]: Circular /usr/src/linux-2.4.20-8/include/asm/smplock.h <- /usr/src/linux-2.4.20-8/include/linux/interrupt.h dependency dropped.

make[2]: Circular /usr/src/linux-2.4.20-8/include/linux/netfilter_ipv4/ip_conntrack_helper.h <- /usr/src/linux-2.4.20-8/include/linux/netfilter_ipv4/ip_conntrack.h dependency dropped.

 错误指出asm/smplock.h和linux/interrupt.h相互依赖,linux/netfilter_ipv4目录下的ip_conntrack_helper.h和ip_conntrack.h相互依赖,笔者用了将近一天时间找原因,原来以为是头文件相互之间包含,但是检查了头文件的之间的包含关系,发现asm/smplock.h包含linux/interrupt.h,但后者并没有(包含间接)包换前者,同样,ip_conntrack_helper.h包含ip_conntrack.h,后者不包含(包括间接)前者.

通过仔细阅读tmp_include_depends文件中相互依赖的文件,发现下面几段文字(省略其它内容):

/usr/src/linux-2.4.20-8/include/linux/interrupt.h:

/usr/src/linux-2.4.20-8/include/asm/hardirq.h

/usr/src/linux-2.4.20-8/include/asm/softirq.h


/usr/src/linux-2.4.20-8/include/asm/softirq.h:

/usr/src/linux-2.4.20-8/include/asm/hardirq.h


/usr/src/linux-2.4.20-8/include/asm/hardirq.h:

/usr/src/linux-2.4.20-8/include/linux/irq.h


/usr/src/linux-2.4.20-8/include/linux/irq.h

/usr/src/linux-2.4.20-8/include/asm/hw_irq.h


/usr/src/linux-2.4.20-8/include/asm/hw_irq.h:

/usr/src/linux-2.4.20-8/include/linux/smp_lock.h


/usr/src/linux-2.4.20-8/include/linux/smp_lock.h:

/usr/src/linux-2.4.20-8/include/asm/smplock.h


/usr/src/linux-2.4.20-8/include/asm/smplock.h:

  /usr/src/linux-2.4.20-8/include/linux/interrupt.h



/usr/src/linux-2.4.20-8/include/linux/netfilter_ipv4/ip_conntrack_helper.h:

/usr/src/linux-2.4.20-8/include/linux/netfilter_ipv4/ip_conntrack.h


/usr/src/linux-2.4.20-8/include/linux/netfilter_ipv4/ip_conntrack.h

/usr/src/linux-2.4.20-8/include/linux/netfilter_ipv4/ip_conntrack_helper.h


可以发现,smplock.h包含interrupt.h,但在tmp_include_depends中,后者竟然包含hardirq.h和softirq.h,这两个文件包含一系列文件最终包含了smplock.h文件,形成一个环,导致头文件循环包含的错误.但经过阅读这两个头文件内容发现, smplock.h确实包含了interrupt.h,但是后者并没有包含hardirq.h和softirq.h,不知道为什么生成的依赖文件中缺确指出包含了,只能解释为makefile文件在定义生成依赖文件时发生了错误.另外一个循环依赖也是同样原因.


解决上述循环依赖的办法是删除错误条目,将/usr/src/linux-2.4.20-8/include/linux/interrupt.h:下面的

/usr/src/linux-2.4.20-8/include/asm/hardirq.h

/usr/src/linux-2.4.20-8/include/asm/softirq.h

删除,再将/usr/src/linux-2.4.20-8/include/linux/netfilter_ipv4/ip_conntrack.h下面的

/usr/src/linux-2.4.20-8/include/linux/netfilter_ipv4/ip_conntrack_helper.h删除即可.












本文转自jetyi51CTO博客,原文链接:http://blog.51cto.com/jetyi/1287793 ,如需转载请自行联系原作者

相关文章
|
3天前
|
Linux 开发工具 C语言
Linux 安装 gcc 编译运行 C程序
Linux 安装 gcc 编译运行 C程序
21 0
|
15天前
|
Linux C语言
Linux内核队列queue.h
Linux内核队列queue.h
|
3天前
|
Linux 开发工具 Android开发
Docker系列(1)安装Linux系统编译Android源码
Docker系列(1)安装Linux系统编译Android源码
6 0
|
8天前
|
算法 Linux 调度
深入理解Linux内核的进程调度机制
【4月更文挑战第17天】在多任务操作系统中,进程调度是核心功能之一,它决定了处理机资源的分配。本文旨在剖析Linux操作系统内核的进程调度机制,详细讨论其调度策略、调度算法及实现原理,并探讨了其对系统性能的影响。通过分析CFS(完全公平调度器)和实时调度策略,揭示了Linux如何在保证响应速度与公平性之间取得平衡。文章还将评估最新的调度技术趋势,如容器化和云计算环境下的调度优化。
|
14天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
20 3
|
16天前
|
安全 Unix Linux
一、linux 常用命令之 linux版本信息 系统管理与设置 持续更新******
一、linux 常用命令之 linux版本信息 系统管理与设置 持续更新******
17 0
|
21天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
21天前
|
Ubuntu Linux
Linux查看内核版本
在Linux系统中查看内核版本有多种方法:1) 使用`uname -r`命令直接显示版本号;2) 通过`cat /proc/version`查看内核详细信息;3) 利用`dmesg | grep Linux`显示内核版本行;4) 如果支持,使用`lsb_release -a`查看发行版及内核版本。
36 6
|
23天前
|
Linux 内存技术
Linux内核读取spi-nor flash sn
Linux内核读取spi-nor flash sn
18 1