序言
我们在参与个别开源项目的过程当中,常常会碰到漏洞之类的问题,须要我们打补丁解决。尤其是Linux源码,源码代码量较多,在更改完内核并发布新内核的时侯,基本采用补丁的形式进行发布,而不是将整个内核打包发布
我们使用补丁发布有好多用处
注:博主本人并没有给linux提过补丁linux 应用patch,本文仅为学习递交补丁的记录,希望对你们有帮助,勿喷
假如了解这方面的佬,也欢迎评论区交流
diff/patch生成补丁
我们以精典的linux0.11版本源码为例,如果说我们当前目录下有两个源码文件夹linux驱动下载,未经更改的源码文件夹为linux-0.11,以及更改完毕的补丁源码linux-0.11-new
注:linux0.11是初期的Linux内核版本,发布于1991年,相当古老,仅供学习使用,而且工程上早已没有使用价值,最新版内核可以到下方的源码库找寻
linux源码库:torvalds/linux:Linuxkernelsourcetree()
linux0.11源码库:karottc/linux-0.11:thesourcecodeoflinux-0.11forstudylinuxkernel()
我们可以拉取两份linux0.11源码,其中一份保持原貌,另外一份作出相应更改,但是重命名文件夹为linux-0.11-new
注:我这里拉取源码时使用参数--exclude=.git排除.git文件夹,避免后续打补丁干扰。假如git版本偏低,没有该功能,可以先克隆,再删掉文件夹
scss
复制代码
git clone --exclude=.git git@github.com:karottc/linux-0.11.git
或则是
bash
复制代码
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补丁文件中
arduino
复制代码
sudo diff -uprN linux-0.11/ linux-0.11-new/ > linux.patch
注:.patch为约定也称的补丁文件扩充名,尽量遵循规范,除此之外名子可以随意起
参数解释:
使用补丁
我们可以直接在当前目录下执行如下打补丁
复制代码
patch -p0 < linux.patch
注:-p参数代表忽视哪级文件路径,0标示去除全路径,1标示除去第一层路径
或则是步入未经更改的linux源码根目录下执行如下打补丁
bash
复制代码
patch -p1 < ../linux.patch
注:这儿的重定向符号你们注意不要写反,我开始就写反了,之后执行命令后系统才会卡死,不会报错,而且也不会中止
我这儿简单作为示例,仅更改了README.md文件
举例解释-p参数,例如说patch文件片断如下
sql
复制代码
--- 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
或则是步入未更改源码根目录,之后执行如下命令
bash
复制代码
patch -Rp1 < ../linux.patch
单文件补丁
里面是对于整个文件夹打补丁,下边将会讲解怎样对单个文件打补丁
使用单独文件依次打补丁,可以愈发有效的验证补丁正确性,便捷后续进行功能测试
例如说我们当前目录有原文件a.c,更改以后的文件b.c,我们可以使用如下命令生成补丁文件
css
复制代码
diff -u a.c b.c > test.patch
bash
复制代码
# 使用补丁
patch a.c < test.patch
# 撤销补丁
patch -RE < test.patch
quilt
简介
当我们在开发自己项目的过程中查看linux是什么系统,可能会只制做大量补丁,管理这种数目庞大的补丁会特别花费时间
所以linux内核开发者AndrewMorton开发出quilt补丁管理工具,以帮助我们更好的管理补丁
官方相关文档
本章将会简单讲解quilt使用流程,更多详尽信息可以查看上方官方文档
使用
只要我们在源代码树里使用了quilt命令,quilt都会在源代码树的根目录构建两个特殊目录:patches和.pc
patches文件夹下为管理的补丁文件
.pc文件夹下保存着其内部工作状态
可以使用如下命令安装
arduino
复制代码
sudo apt-get install quilt
新建补丁文件
arduino
复制代码
quilt new xxx.patch
补丁文件关联更改文件,关联后即可对文件进行更改,如要关联多个文件,重复添加之后更改即可
csharp
复制代码
quilt add file
查看补丁是否正确
复制代码
quilt diff
保存补丁,然后补丁文件会保存在patches
复制代码
quilt refresh
git
git提供了两种补丁方案
gitdiff生成的文件不富含commit信息linux 应用patch,可以指定文件生成diff,也可以指定单个commit,多个commit生成
gitformat-patch生成的.patch文件富含commmit信息,一个commit对应一个patch文件
注:本章将会简单讲解git补丁流程,倘若您须要更详尽的文档说明,博主会将在每小章开头附上git官网文档链接,供您参考
gitdiff
官方文档:Git-git-diffDocumentation()
制做补丁命令如下
bash
复制代码
# 单独文件补丁
git diff Test.java > test.patch
# 所有文件补丁
git diff > test.patch
指定commitid制做补丁
bash
复制代码
git diff [commit sha1 id] [commit sha1 id]> test.patch
gitformat-patch
官方文档:Git-git-format-patchDocumentation()
制做当前分支超前于指定分支递交的补丁
注:命令示例即为制做超前于master分支的补丁
lua
复制代码
git format-patch -M master
制做某次递交之后的补丁
python
复制代码
git format-patch [commit id]
某两次递交之间补丁
python
复制代码
git format-patch [commit sha1 id]..[commit sha1 id]
应用补丁
检测补丁文件
bash
复制代码
git apply --stat xxx.patch
检测能够应用成功
css
复制代码
git apply --check xxx.patch
使用补丁
css
复制代码
git am --signoff < xxx.patch
并且可能会出现我们前面提及的冲突,造成使用补丁失败,出现如下错误
vbnet
复制代码
$ 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的文件,之后递交代码到源码库即可
最后
为了帮助你们更好的学习网路安全,小编给你们打算了一份网路安全入门/进阶学习资料,上面的内容都是适宜零基础小白的笔记和资料,不懂编程也能听懂、看懂,所有资料共282G,同学们假如有须要全套网路安全入门+进阶学习资源包,可以点击免费发放(如遇扫码问题,可以在评论区留言发放哦)~
有须要的男子伴,可以点击下方链接免费发放或则V扫描下方二维码免费发放
CSDN大礼包:全网最全《网络安全入门&进阶学习资源包》免费分享(安全链接,放心点击)
1️⃣零基础入门①学习路线
对于从来没有接触过网路安全的朋友,我们帮你打算了详尽的学习成长路线图。可以说是最科学最系统的学习路线,你们跟随这个大的方向学习准没问题。
②路线对应学习视频
同时每位成长路线对应的蓝筹股都有配套的视频提供:
因篇幅有限,仅展示部份资料
2️⃣视频配套资料&国外内网安书籍、文档①文档和书籍资料
②黑客技术
因篇幅有限,仅展示部份资料
CSDN大礼包:全网最全《网络安全入门&进阶学习资源包》免费分享(安全链接,放心点击)
3️⃣网路安全源码合辑+工具包
4️⃣网路安全笔试题
5️⃣汇总
所有资料⚡️,同学们假如有须要全套《网络安全入门+进阶学习资源包》,扫码获取~
CSDN大礼包:全网最全《网络安全入门&进阶学习资源包》免费分享(安全链接,放心点击)
本文原创地址://gulass.cn/xxrhzlymzsch.html编辑:刘遄,审核员:暂无