Linux近两年高危漏洞修复过程记录_cve-2023-27535(1)

本文详细介绍了Linux内核配置的过程,包括make menuconfig的使用、配置文件的管理和内核打补丁场景。讲解了make defconfig、make menuconfig、make oldconfig等命令的区别,并探讨了GCC编译选项,如--enable-bootstrap和--enable-checking。此外,还讨论了内核编译时的GCC版本检查和内核配置检查的重要性。
摘要由CSDN通过智能技术生成

SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/
-e s/arm.*/arm/ -e s/sa110/arm/
-e s/s390x/s390/ -e s/parisc64/parisc/
-e s/ppc.*/powerpc/ -e s/mips.*/mips/
-e s/sh[234].*/sh/ )

export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=

比如是通过 make ARCH=arm menuconfig命令来生成的配置界面,系统就会读取arm/arm/kconfig文件生成配置选项。

其次,它的一些默认配置选项,存放在arch/$ARCH/configs/目录下,对于arm来说就是arch/arm/configs文件夹,此文件夹中有许多选项,系统会读取哪个呢?内核默认会读取linux内核根目录下.config文件作为内核的默认选项。我们可以选择直接修改.config文件然后执行make menuconfig命令读取新的选项。但是一般并不这样做,在menuconfig配置界面中,我们可通过空格、esc、回车选择某些选项选中或者不选中,最后保存退出的时候,Linux内核会把新的选项更新到.config中,此时我们可以把.config重命名为其它文件保存起来(当执行make distclean时系统会把.config文件删除),以后我们再配置内核时就不需要再去arch/arm/configs下考取相应的文件了,省去了重新配置的麻烦,直接将保存的.config文件复制为.config文件load即可。

通过过以上两步,我们就可以正确的读取、配置我们需要的界面了,那么他们如何跟makefile文件建立编译关系呢?当你保存make menuconfig选项时,系统会除了会自动更新.config外,还会将所有的选项以宏的形式保存在Linux内核根目录下的 include/generated/autoconf.h文件下。内核中的源代码就都会这些.h文件,根据宏的定义情况进行条件编译。当我们需要对一个文件整体选择是否编译时,还需要修改对应的makefile文件,例如:
在这里插入图片描述
我们选择是否要编译s3c2410_ts.c这个文件时,makefile会根据CONFIG_TOUCHSCREEN_S3C2410来决定是编译此文件,此宏是在Kconfig文件中定义,当我们配置完成后,会出现在.config及autconf中,至此,我们就完成了整个linux内核的编译过程。最后我们会发现,整个linux内核配置过程中,留给用户的接口其实只有各层Kconfig、makefile文件以及对应的源文件

比如我们如果想要给内核增加一个功能,并且通过make menuconfig控制其声称过程首先需要做的工作是:修改对应目录下的Kconfig文件,按照Kconfig语法增加对应的选项;其次执行make menuconfig选择编译进内核或者不编译进内核,或者编译为模块,.config文件和autoconf.h文件会自动生成;最后修改对应目录下的makefile文件完成编译选项的添加;最后的最后执行make命令进行编译。

4.3、config和Makefile文件

Linux内核源码树的每个目录下都有两个文档Kconfig和Makefile。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单。在执行内核配置make menuconfig时,从Kconfig中读出菜单,用户选择后保存到**.config的内核配置文档**中。在内核编译时,由Makefile调用这 个.config,就知道了用户的选择。这个内容说明Kconfig就是对应着内核的每级配置菜单。

假如要想添加新的驱动到内核的源码中,要修改Kconfig,这样就能够选择这个驱动,假如想使这个驱动被编译,则要修改Makefile。添加新的驱动时需要修改的文档有两种(如果添加的只是文件,则只需修改当前层Kconfig和Makefile文件;如果添加的是目录,则需修改当前层和目录下 的共一对Kconfig和Makefile)Kconfig和Makefile。要想知道怎么修改这两种文档,就要知道两种文档的语法结构,Kconfig的语法参见参考文献《【linux-2.6.31】kbuild》。
Makefile 文件包含 5 部分:

内核文件 说明
Makefile 顶层的 Makefile
.config 内核配置文件
arch/$(ARCH)/Makefile 体系结构 Makefile
scripts/Makefile.* 适用于所有 kbuild Makefile 的通用规则等
kbuild Makefiles 大约有 500 个这样的文件

顶层 Makefile 读取内核配置,产生的.config 文件,顶层 Makefile 构建两个主要的目标:vmlinux(内核映像)和 modules(所有模块文件)。它通过递归访问内核源码树下的子目录来构建这些目标。访问哪些子目录取决于内核配置。顶层 Makefile 包含一个体系结构 Makefile,由 arch/$(ARCH)/Makefile 指定。体系结构 Makefile 文件为顶层 Makefile 提供了特定体系结构的信息。每个子目录各有一个 kbuild文件和Makefile 文件来执行从上层传递下来的命令。kbuild和Makefile文件利用.config 文件中的信息来构造由 kbuild 构建内建或者模块对象使用的各种文件列表。scripts/Makefile.*包含所有的定义/规则,等等。这些信息用于使用 kbuild和 Makefile 文件来构建内核。

注:不分摘自http://blog.chinaunix.net/uid-26497520-id-3593098.html#0

4.3、linux内核打补丁场景参考

1)使 2.6.23.11 升级到 2.6.23.12. 我应该先把 2.6.23.11 回退成 2.6.23 然后再打 2.6.23.12 的补丁:

bzcat …/patch-2.6.23.11.bz2|patch -p1 -R #回退到 2.6.23
bzcat …/patch-2.6.23.12.bz2|patch -p1 #打到 2.6.23.12

2)2.6.22.9 先要降级到 2.6.22 然后升级到 2.6.23. 再升级到 2.6.23.9

bzcat …/patch-2.6.22.9.bz2|patch -p1 -R #使用 R 命令意思是取消补丁。这样我们就把 22.9 降到 22
zcat …/patch-2.6.23.gz|patch -p1 #这样就升级到了 2.6.23
zcat …/patch-2.6.23.11.bz2|patch -p1 # 这样就升级到了 2.6.23.11 这是现在 stable 的最新版

4.4、make defconfig、 make menuconfig、 make savedefconfig、 make olddefconfig 、make localmodconfig 、make oldconfig区别

1) make defconfig

首先通过make xxx_defconfig,生成最开始的.config,相当于把 XXX_defconfig 文件复制为 .config 文件,其中 defconfig 是最小的 config 项,kernel编译会根据 .config 文件去编译驱动情况,加载过该指令后,后面的 make menuconfig 就会基于现在的 .config 去配置 config ;

2)make menuconfig

make menuconfig (图像界面,基于ncurses库)的作用类似于 make config (后者是文本类型的对话),就是基于界面去配置 config 文件,make config 的作用是加载 “ .config ” 作为默认的配置,配置它就是相当于用图形化界面配置 .config 文件;

3)make savedefconfig

执行 make saveconfig 作用是通过执行.config 生成最小的 defconfig 文件;

4)make olddefconfig

通过make oldconfig将刚增加的config项的.config做依赖检查重新生成新的.config文件,且新生成的.config和以前的不同是,将旧的.config重命名为.config.old文件。可通过执行diffconfig .config.old .config ,对比一下新老内核配置的区别
5)make localmodconfig

通make localmodconfig 会执行 lsmod 命令查看当前系统中加载了哪些模块 (Mod

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值