编译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 ,如需转载请自行联系原作者

相关文章
|
11月前
|
安全 网络协议 Linux
深入理解Linux内核模块:加载机制、参数传递与实战开发
本文深入解析了Linux内核模块的加载机制、参数传递方式及实战开发技巧。内容涵盖模块基础概念、加载与卸载流程、生命周期管理、参数配置方法,并通过“Hello World”模块和字符设备驱动实例,带领读者逐步掌握模块开发技能。同时,介绍了调试手段、常见问题排查、开发规范及高级特性,如内核线程、模块间通信与性能优化策略。适合希望深入理解Linux内核机制、提升系统编程能力的技术人员阅读与实践。
973 1
|
11月前
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
1080 0
|
11月前
|
Web App开发 缓存 Rust
|
11月前
|
Ubuntu 安全 Linux
Ubuntu 发行版更新 Linux 内核,修复 17 个安全漏洞
本地攻击者可以利用上述漏洞,攻击 Ubuntu 22.10、Ubuntu 22.04、Ubuntu 20.04 LTS 发行版,导致拒绝服务(系统崩溃)或执行任意代码。
|
算法 Linux 调度
深入理解Linux内核调度器:从基础到优化####
本文旨在通过剖析Linux操作系统的心脏——内核调度器,为读者揭开其高效管理CPU资源的神秘面纱。不同于传统的摘要概述,本文将直接以一段精简代码片段作为引子,展示一个简化版的任务调度逻辑,随后逐步深入,详细探讨Linux内核调度器的工作原理、关键数据结构、调度算法演变以及性能调优策略,旨在为开发者与系统管理员提供一份实用的技术指南。 ####
685 4
|
机器学习/深度学习 人工智能 负载均衡
深度解析:Linux内核调度策略的演变与优化
【5月更文挑战第30天】 随着计算技术的不断进步,操作系统的性能调优成为了提升计算机系统效率的关键。在众多操作系统中,Linux因其开源和高度可定制性而备受青睐。本文将深入剖析Linux操作系统的内核调度策略,追溯其历史演变过程,并重点探讨近年来为适应多核处理器和实时性要求而产生的调度策略优化。通过分析比较不同的调度算法,如CFS(完全公平调度器)、实时调度类和批处理作业的调度需求,本文旨在为系统管理员和开发者提供对Linux调度机制深层次理解,同时指出未来可能的发展趋势。
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
744 24
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####