『Linux』补丁制作指南

news2024/9/30 11:41:03

前言

我们在参与某些开源项目的过程当中,经常会遇到漏洞之类的问题,需要我们打补丁解决。尤其是 Linux 源码,源码代码量较多,在修改完内核并发布新内核的时候,基本采用补丁的方式进行发布,而不是将整个内核打包发布

我们使用补丁发布有很多好处

  • 补丁体积很小,方便成员获取
  • 补丁方便保存,本地可以保存多个版本内核
  • 使用方便快捷,直接将补丁放到源码对应目录,然后执行相应命令即可

注:博主本人并没有给 linux 提过补丁,本文仅为学习提交补丁的记录,希望对大家有帮助,勿喷

如果了解这方面的佬,也欢迎评论区交流

diff / patch

生成补丁

我们以经典的 linux 0.11 版本源码为例,假如说我们当前目录下有两个源码文件夹,未经修改的源码文件夹为 linux-0.11,以及修改完毕的补丁源码 linux-0.11-new

注:linux 0.11 是早期的 Linux 内核版本,发布于 1991 年,相当古老,仅供学习使用,但是工程上已经没有使用价值,最新版内核可以到下方的源码库寻找

linux 源码库:torvalds/linux: Linux kernel source tree (github.com)

linux 0.11 源码库:karottc/linux-0.11: the source code of linux-0.11 for study linux kernel (github.com)

jfxokrm49ir88avza8ckweia6z0wcxa

我们可以拉取两份 linux 0.11 源码,其中一份保持原样,另外一份做出相应修改,并且重命名文件夹为 linux-0.11-new

注:我这里拉取源码时使用参数 --exclude=.git 排除 .git 文件夹,防止后续打补丁干扰。如果 git 版本过低,没有该功能,可以先克隆,再删除文件夹

git clone --exclude=.git git@github.com:karottc/linux-0.11.git

或者是

git clone git@github.com:karottc/linux-0.11.git
git clone git@github.com:karottc/linux-0.11.git ./linux-0.11-new
rm -rf linux-0.11/.git
rm -rf linux-0.11-new/.git

然后使用下面的 diff 命令,输出原始源码和修改之后的源码的文件区别,并重定向输出到 linux.patch 补丁文件中

sudo diff -uprN linux-0.11/ linux-0.11-new/ > linux.patch

注:.patch 为约定俗称的补丁文件扩展名,尽量遵守规范,除此之外名字可以随便起

image-20231024121717456

参数解释:

  • -u: 生成统一格式的差异输出,通常用于生成补丁文件。
  • -p: 在差异输出中显示更多的上下文信息,以方便阅读。
  • -r: 对目录进行递归比较,而不仅仅比较单个文件。
  • -N: 当比较的文件是空文件时,也显示差异信息。

使用补丁

我们可以直接在当前目录下执行如下打补丁命令

patch -p0 < linux.patch

注:-p 参数代表忽略哪级文件路径,0 标识去掉全路径,1 标识去掉第一层路径

或者是进入未经修改的 linux 源码根目录下执行如下打补丁命令

patch -p1 < ../linux.patch

注:这里的重定向符号大家注意不要写反,我开始就写反了,然后执行命令后系统就会卡死,不会报错,但是也不会终止

我这里简单作为示例,仅修改了 README.md 文件

image-20231024164926061

举例解释 -p 参数,比如说 patch 文件片段如下

--- old/modules/pcitable      Mon Sep 27 11:03:56 1999

+++ new/modules/pcitable      Tue Dec 19 20:05:41 2000

如果使用参数 -p0,那就表示从当前目录找一个叫做 old 的文件夹,再在它下面寻找 modules/pcitable 文件来执行 patch 操作

而如果使用参数 -p1,那就表示忽略第一层目录(即不管 old),从当前目录寻找 modules 的文件夹,再在它下面找 pcitable

最后我们可能出现冲突,通常是因为原始文件已经被修改过,这时我们只需要手动解决这些冲突,然后重新执行补丁即可

注:但是建议最好不要手动修改原版代码,不然后续改比较麻烦

撤销补丁

我们可以执行如下命令撤销补丁

patch -Rp0 < linux.patch

或者是进入未修改源码根目录,然后执行如下命令

patch -Rp1 < ../linux.patch

单文件补丁

上面是对于整个文件夹打补丁,下面将会讲解如何对单个文件打补丁

使用单独文件依次打补丁,可以更加有效的验证补丁正确性,方便后续进行功能测试

比如说我们当前目录有原文件 a.c ,修改之后的文件 b.c,我们可以使用如下命令生成补丁文件

diff -u a.c b.c > test.patch
# 使用补丁
patch a.c < test.patch
# 撤销补丁
patch -RE < test.patch

quilt

简介

当我们在开发自己项目的过程中,可能会只制作大量补丁,管理这些数量庞大的补丁会非常耗费时间

所以 linux 内核开发者 Andrew Morton 开发出 quilt 补丁管理工具,以帮助我们更好的管理补丁

官方相关文档

  • quilt-doc.dvi (shakthimaan.com)
  • Linux Kernel Configuration - Managing Your Patches With quilt (linuxtopia.org)
  • quilt man | Linux Command Library

本章将会简单讲解 quilt 使用流程,更多详细信息可以查看上方官方文档

使用

只要我们在源代码树里使用了 quilt 命令,quilt 就会在源代码树的根目录建立两个特殊目录:patches 和.pc

patches 文件夹下为管理的补丁文件

.pc 文件夹下保存着其内部工作状态

可以使用如下命令安装

sudo apt-get install quilt

新建补丁文件

quilt new xxx.patch

补丁文件关联修改文件,关联后即可对文件进行修改,如要关联多个文件,重复添加然后修改即可

quilt add file

查看补丁是否正确

quilt diff

保存补丁,之后补丁文件会保存在 patches

quilt refresh

git

git 提供了两种补丁方案

  • git diff 生成的 .diff 文件
  • git format-patch 生成的 .patch 文件

git diff 生成的文件不含有 commit 信息,可以指定文件生成 diff,也可以指定单个 commit, 多个 commit 生成

git format-patch 生成的 .patch 文件 含有 commmit 信息,一个 commit 对应一个 patch 文件

注:本章将会简单讲解 git 补丁流程,如果您需要更详细的文档说明,博主会将在每小章开头附上 git 官网文档链接,供您参考

git diff

官方文档:Git - git-diff Documentation (git-scm.com)

制作补丁命令如下

# 单独文件补丁
git diff Test.java > test.patch
# 所有文件补丁
git diff  > test.patch

指定 commit id 制作补丁

git diff [commit sha1 id] [commit sha1 id]> test.patch

git format-patch

官方文档:Git - git-format-patch Documentation (git-scm.com)

制作当前分支超前于指定分支提交的补丁

注:命令示例即为制作超前于 master 分支的补丁

git format-patch -M master

制作某次提交以后的补丁

git format-patch [commit id]

某两次提交之间补丁

git format-patch [commit sha1 id]..[commit sha1 id]

应用补丁

检查补丁文件

git apply --stat   xxx.patch

检查能否应用成功

git apply --check xxx.patch

使用补丁

git am --signoff < xxx.patch

但是可能会出现我们上面提到的冲突,导致使用补丁失败,出现如下错误

$ git am PATCH
Applying: PACTH DESCRIPTION
error: patch failed: file.c:137
error: file.c: patch does not apply
error: patch failed: Makefile:24
error: libavfilter/Makefile: patch does not apply
Patch failed at 0001 PATCH DESCRIPTION
When you have resolved this problem run "git am --resolved".
If you would prefer to skip this patch, instead run "git am --skip".
To restore the original branch and stop patching run "git am --abort".

解决冲突

使用下面命令自动合并不冲突代码,保留冲突部分

执行后会生成后缀为 .rej 的文件,保存没有合并进去的部分的内容,可以参考这个进行冲突解决

解决完冲突后删除后缀为 .rej 的文件,然后提交代码到源码库即可

git  apply --reject  xxxx.patch

参考链接

  • linux内核生成补丁和打补丁的方法 - 知乎 (zhihu.com)
  • 为文件/文件夹打补丁 - 简书 (jianshu.com)
  • Linux diff 命令 | 菜鸟教程 (runoob.com)
  • Linux patch命令 | 菜鸟教程 (runoob.com)
  • patch 命令打补丁,diff 命令制作补丁-腾讯云 (tencent.com)
  • Linux 下打 patch-腾讯云开发者社区-腾讯云 (tencent.com)
  • Quilt初探 - 使用 quilt 產生和管理 patch
  • quilt补丁制作 | Luobu (luobudiao.github.io)
  • 提交第一份 Patch 到 Linux Kernel - HackMD

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1139969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在vscode中添加less插件

Less &#xff08;Leaner Style Sheets 的缩写&#xff09; 是一门向后兼容的 CSS 扩展语言。它对CSS 语言增加了少许方便的扩展&#xff0c;通过less可以编写更少的代码实现更强大的样式。但less不是css&#xff0c;浏览器不能直接识别&#xff0c;即浏览器无法执行less代码&a…

基于java+swing+mysql实现的仓库商品管理系统

JavaSwingmysql用户信息管理系统 一、系统介绍二、功能展示三、项目相关3.1 乱码问题3.2 如何将GBK编码系统修改为UTF-8编码的系统&#xff1f; 四、其它1.其他系统实现 五、源码下载 一、系统介绍 本系统实现了两个角色层面的功能&#xff0c;管理员可以管理用户、仓库、商品…

ED8000 地下电子标签探测器|标识器探测仪深度测量校准操作说明

ED8000 地下电子标签探测器|电子标识器探测仪是探测地下电子标签或电子标识器的专用手持仪器&#xff0c;采用基于 ARM 架构的32位高性能处理器&#xff0c;反应敏捷&#xff1b;距离测量时采用异步差分测量技术&#xff08;已申请专利&#xff09;&#xff0c;即使在有干扰的情…

论文阅读——DistilBERT

ArXiv&#xff1a;https://arxiv.org/abs/1910.01108 Train Loss: DistilBERT&#xff1a; DistilBERT具有与BERT相同的一般结构&#xff0c;层数减少2倍&#xff0c;移除token类型嵌入和pooler。从老师那里取一层来初始化学生。 The token-type embeddings and the pooler a…

windows11系统如何关闭自带杀毒软件

在有时候 我们下载一些东西 通过不过杀毒软件 需要关闭 不过我还是奉劝大家 过不了的 可能就代表着携带病毒 还是慎重为好 弄清楚来源免得给自己带来麻烦 毕竟电脑也是贵重物品 首先 右键下方菜单 选择设置 在左侧菜单中 选择 隐私和安全性 在新弹出的面板中选择 Windows 安…

SpringCloud微服务多应用脚手架的搭建与部署

最近几年SpringBoot大热&#xff0c;很多IT公司都开始采用SpringBoot来替换传统的SpringMVC项目。那么如何搭建一个适合开发的项目架构呢&#xff1f; 这里我主要介绍Java程序员使用最多的两种工具进行搭建&#xff1a;1、MyEclipse&#xff1b;2、idea MyEclipse搭建 第一步…

港联证券:2万元股票一进一出手续费?

股市生意中的手续费是出资者无法避免的一项费用。关于许多出资者来说&#xff0c;手续费的多少对出资收益有着重要的影响。本文将从多个视点分析2万元股票一进一出手续费&#xff0c;并讨论其对出资者和商场的影响。 首先&#xff0c;从出资者的视点来看&#xff0c;2万元股票…

数据分析必备原理思路(三)

文章目录 四、图文并茂的数据汇报与观点表达1. 什么是数据表达?2. 数据表达的目的是什么?3. 为什么要基于数据进行表达?4. 如何基于图表进行优质的数据表达&#xff1f;&#xff08;1&#xff09;提炼文字观点&#xff08;2&#xff09;制作完善图表a. 视觉映射原理与可视化…

偏微分方程为什么要先先验估计再求解的存在性,先验估计有什么用?

见知乎 https://www.zhihu.com/question/43549959?utm_sourceqq&utm_mediumsocial&utm_oi1315073218793488384

国产数据库达梦Dm8部署

点击上方蓝字关注我 1. 部署前工作 1.1 介质下载 下载地址&#xff1a;https://www.dameng.com/list_103.html 结合服务器类型选择对应版本&#xff1a; 1.2 环境检查 硬件环境要求 用户应根据 DM 及应用系统的需求来选择合适的硬件配置&#xff0c;如 CPU 的指标、内存及磁盘…

米软科技客户单病种上报量云南省第一

近日米软获悉&#xff0c;在云南省统计的单病种上报情况中&#xff0c;截止2021年11月15日&#xff0c;上线单病种系统不足半年的红河州第一人民医院&#xff08;云南省滇南中心医院&#xff09;以占全省上报总数5%的22950例&#xff0c;遥遥领先于同省各家二三级医院。 全省上…

SAP 让ALV表格修改后保存到数据库(1.设置图标事件;2.LVC_S_GLAY-EDT_CLL_CB字段直接实现)

SAP ALV报表输出后&#xff0c;用户更改ALV上可编辑的数据&#xff0c;然后保存回SAP内表去&#xff0c;这种需求有两种实现方式 1.给ALV输出界面设置额外工具条按钮来实现 2.ALV 函数 REUSE_ALV_GRID_DISPLAY_LVC 的参数 I_GRID_SETTINGS &#xff0c;设置 LVC_S_GLAY-EDT_CLL…

LibreOffice中如何插入公式

点击 插入-》对象-》公式对象&#xff0c;调出公式编辑界面&#xff1a; 可以在左侧的下拉列表中选择要插入的公式的种类&#xff1a; 例如&#xff0c;在下拉列表中选择“函数”&#xff0c; 选择要插入的函数&#xff0c;例如指数函数&#xff1a; 在右侧编辑窗口就可…

【Java每日一题】——第四十一题:编写程序描述影视歌三栖艺人。(2023.10.27)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

部署应用链太费心?Tanssi 教你轻松开发部署

如果你在构建一个跨链的去中心化交易所&#xff0c;需要聚合不同链的数据&#xff0c;或者想打造一个链上实时战略游戏&#xff0c;现有公链由于缺乏可定制性&#xff0c;都无法满足这样的需求&#xff0c;因为难以处理开发这些应用所需的处理量、数据聚合或隐私要求。因此&…

百度智能云获评Forrester中国市场人工智能/机器学习平台领导者

写在前面百度智能云AI平台&#xff0c;打造企业智能化转型的基础设施大模型时代&#xff0c;百度智能云AI平台迎来全面升级 写在前面 日前&#xff0c;国际权威咨询机构 Forrester 发布了最新的《The Forrester Wave™&#xff1a;中国市场人工智能/机器学习平台厂商评测&…

word2vec两种优化方式的联系和区别

总结不易&#xff0c;请大力点赞&#xff0c;感谢 上一个文章&#xff0c;Word2vec-负采样/霍夫曼之后模型是否等价-绝对干货是字节的面试真题&#xff0c;建议朋友们多看几遍&#xff0c;有问题及时沟通。 私下有几个朋友看完之后还是有点懵&#xff0c;又问了一下具体细节。…

云起无垠典型案例入选《2023软件供应链安全洞察》报告

近日&#xff0c;历时6个月&#xff0c;由ISC编制的《2023软件供应链安全洞察》报告&#xff08;以下简称《报告》&#xff09;正式对外发布。《报告》围绕软件供应链安全现状、技术内核、治理指南、落地实践展开&#xff0c;以期为行业从业者提供有价值的信息和洞见&#xff0…

港联证券:124份对外投资公告揭示:A股民营企业投资积极性上升

自“民营经济31条”发布以来&#xff0c;A股民营上市公司出资热心明显上升。据上海证券报记者不完全统计&#xff0c;7月至今&#xff0c;已有124家民营上市公司发布了对外出资公告&#xff0c;其间42家公司对外出资规划达10亿元以上&#xff0c;且不乏百亿级大单&#xff0c;最…

新能源下半场要拼“电池”,欣旺达动力胜算几何?

如今&#xff0c;续航焦虑、里程焦虑是新能源汽车避不开的话题。因此&#xff0c;电池作为续航的核心硬件&#xff0c;其质量的好坏自然也就成为了市场颇为关心的话题&#xff0c;与之相关的新能源电池厂商也受到了越来越多的关注。 其中&#xff0c;新能源电池厂商中的新秀—…