Linux下Patch的应用和制作方法介绍

linux patch 的制作方式 patch制作和使用的基本操作 阅读详情

Linux下Patch的应用和制作方法介绍 (1)

 
发布时间:2007.04.19 06:10     来源:赛迪网技术社区    作者:skid

 

因为在u-boot移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。

 

学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者baidu搜索一下,然后选择有价值的资料,方法二是阅读man在线文档。完成收集工作,当然最终要在自己的Linux上作实验,比较总结,消化吸收为自己的东西。要除去这么一种错误思想:一定要学全。要知道,一次学全是不可能的,只能先学习最为常用的,在以后不断实践的过程中逐步的丰富,最终达到比较高的水平。把握的原则是:日有所学,学以致用,用以促学。

 

首先介绍一下diff和patch。在这里不会把man在线文档上所有的选项都介绍一下,那样也没有必要。在99%的时间里,我们只会用到几个选项。所以必须学会这几个选项。

 

1、diff

 

NAME

 

diff - find differences between two files

 

SYNOPSIS

 

diff [options] from-file to-file

 

简单的说,diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁。语法格式:diff 【选项】 源文件(夹) 目的文件(夹),就是要给源文件(夹)打个补丁,使之变成目的文件(夹),术语也就是“升级”。下面介绍三个最为常用选项:

 

-r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。

 

-N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。

 

-u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。

 

2、patch

 

NAME

 

patch - apply a diff file to an original

 

SYNOPSIS

 

patch [options] [originalfile [patchfile]]

 

but usually just

 

patch -pnum

 

简单的说,patch就是利用diff制作的补丁来实现源文件(夹)和目的文件(夹)的转换。这样说就意味着你可以有源文件(夹)――>目的文件(夹),也可以目的文件(夹)――>源文件(夹)。下面介绍几个最常用选项:

 

-p0 选项要从当前目录查找目的文件(夹)

 

-p1 选项要忽略掉第一层目录,从当前目录开始查找。

 

在这里以实例说明:

 

--- 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。这样的前提是当前目录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。当然,可以用相对路径,也可以用绝对路径。不过我一般习惯用相对路径。

 

-E 选项说明如果发现了空文件,那么就删除它

 

-R 选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)

 

下面结合具体实例来分析和解决,分为两种类型:为单个文件打补丁和为文件夹内的多个文件打补丁。

 

环境:在RedHat 9.0下面以armlinux用户登陆。

 

目录树如下:

 

|-- bootloader

 

|-- debug

 

|-- images

 

|-- kernel

 

|-- program

 

|-- rootfiles

 

|-- software

 

|-- source

 

|-- sysapps

 

|-- tmp

 

`-- tools

 

下面在program文件夹下面建立patch文件夹作为实验用,然后进入patch文件夹。

 

一、为单个文件进行补丁操作

 

1、建立测试文件test0、test1

 

[armlinux@lqm patch]$ cat >>test0<

 

> 111111

 

> 111111

 

> 111111

 

> EOF

 

[armlinux@lqm patch]$ more test0

 

111111

 

111111

 

111111

 

[armlinux@lqm patch]$ cat >>test1<

 

> 222222

 

> 111111

 

> 222222

 

> 111111

 

> EOF

 

[armlinux@lqm patch]$ more test1

 

222222

 

111111

 

222222

 

111111

 

2、使用diff创建补丁test1.patch

 

[armlinux@lqm patch]$ diff -uN test0 test1 > test1.patch

 

【注:因为单个文件,所以不需要-r选项。选项顺序没有关系,即可以是-uN,也可以是-Nu。】

 

[armlinux@lqm patch]$ ls

 

test0 test1 test1.patch

 

[armlinux@lqm patch]$ more test1.patch

 

patch文件的结构

 

补丁头

 

补丁头是分别由---/+++开头的两行,用来表示要打补丁的文件。---开头表示旧文件,+++开头表示新文件。

 

一个补丁文件中的多个补丁

 

一个补丁文件中可能包含以---/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。

 

块

 

块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。

 

块的缩进

 

块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。

 

块的第一列

 

+号表示这一行是要加上的。

 

-号表示这一行是要删除的。

 

没有加号也没有减号表示这里只是引用的而不需要修改。

 

************************************************************

 

***diff命令会在补丁文件中记录这两个文件的首次创建时间,如下***

 

--- test0 2006-08-18 09:12:01.000000000 +0800

 

+++ test1 2006-08-18 09:13:09.000000000 +0800

 

@@ -1,3 +1,4 @@

 

+222222

 

111111

 

-111111

 

+222222

 

111111

 

[armlinux@lqm patch]$ patch -p0 < test1.patch

 

patching file test0

 

[armlinux@lqm patch]$ ls

 

test0 test1 test1.patch

 

[armlinux@lqm patch]$ cat test0

 

222222

 

111111

 

222222

 

111111

 

3、可以去除补丁,恢复旧版本

 

[armlinux@lqm patch]$ patch -RE -p0 < test1.patch

 

patching file test0

 

[armlinux@lqm patch]$ ls

 

test0 test1 test1.patch

 

[armlinux@lqm patch]$ cat test0

 

111111

 

111111

 

111111

二、为多个文件进行补丁操作

 

1、创建测试文件夹

 

[armlinux@lqm patch]$ mkdir prj0

 

[armlinux@lqm patch]$ cp test0 prj0

 

[armlinux@lqm patch]$ ls

 

prj0 test0 test1 test1.patch

 

[armlinux@lqm patch]$ cd prj0/

 

[armlinux@lqm prj0]$ ls

 

test0

 

[armlinux@lqm prj0]$ cat >>prj0name<

 

> --------

 

> prj0/prj0name

 

> --------

 

> EOF

 

[armlinux@lqm prj0]$ ls

 

prj0name test0

 

[armlinux@lqm prj0]$ cat prj0name

 

--------

 

prj0/prj0name

 

--------

 

[armlinux@lqm prj0]$ cd ..

 

[armlinux@lqm patch]$ mkdir prj1

 

[armlinux@lqm patch]$ cp test1 prj1

 

[armlinux@lqm patch]$ cd prj1

 

[armlinux@lqm prj1]$ cat >>prj1name<

 

> ---------

 

> prj1/prj1name

 

> ---------

 

> EOF

 

[armlinux@lqm prj1]$ cat prj1name

 

---------

 

prj1/prj1name

 

---------

 

[armlinux@lqm prj1]$ cd ..

 

2、创建补丁

 

[armlinux@lqm patch]$ diff -uNr prj0 prj1 > prj1.patch

 

[armlinux@lqm patch]$ more prj1.patch

 

diff -uNr prj0/prj0name prj1/prj0name

 

--- prj0/prj0name 2006-08-18 09:25:11.000000000 +0800

 

+++ prj1/prj0name 1970-01-01 08:00:00.000000000 +0800

 

@@ -1,3 +0,0 @@

 

---------

 

-prj0/prj0name

 

---------

 

diff -uNr prj0/prj1name prj1/prj1name

 

--- prj0/prj1name 1970-01-01 08:00:00.000000000 +0800

 

+++ prj1/prj1name 2006-08-18 09:26:36.000000000 +0800

 

@@ -0,0 +1,3 @@

 

+---------

 

+prj1/prj1name

 

+---------

 

diff -uNr prj0/test0 prj1/test0

 

--- prj0/test0 2006-08-18 09:23:53.000000000 +0800

 

+++ prj1/test0 1970-01-01 08:00:00.000000000 +0800

 

@@ -1,3 +0,0 @@

 

-111111

 

-111111

 

-111111

 

diff -uNr prj0/test1 prj1/test1

 

--- prj0/test1 1970-01-01 08:00:00.000000000 +0800

 

+++ prj1/test1 2006-08-18 09:26:00.000000000 +0800

 

@@ -0,0 +1,4 @@

 

+222222

 

+111111

 

+222222

 

+111111

 

[armlinux@lqm patch]$ ls

 

prj0 prj1 prj1.patch test0 test1 test1.patch

 

[armlinux@lqm patch]$ cp prj1.patch ./prj0

 

[armlinux@lqm patch]$ cd prj0

 

[armlinux@lqm prj0]$ patch -p1 < prj1.patch

 

patching file prj0name

 

patching file prj1name

 

patching file test0

 

patching file test1

 

[armlinux@lqm prj0]$ ls

 

prj1name prj1.patch test1

 

[armlinux@lqm prj0]$ patch -R -p1 < prj1.patch

 

patching file prj0name

 

patching file prj1name

 

patching file test0

 

patching file test1

 

[armlinux@lqm prj0]$ ls

 

prj0name prj1.patch test0

 

-------------------

 

总结一下:

 

单个文件

 

diff –uN from-file to-file >to-file.patch

 

patch –p0 < to-file.patch

 

patch –RE –p0 < to-file.patch

 

多个文件

 

diff –uNr from-docu to-docu >to-docu.patch

 

patch –p1 < to-docu.patch

 

patch –R –p1

 

-------------------

 

三、应用

 

为内核打补丁。前面在创建交叉编译工具链时,其中有一步就是为内核打补丁。当时还不是特别了解,现在很清晰了。参考前面的文章《基于ARM+Linux嵌入式开发的开发工具链的建立》。

 

1、首先是解压,因为发布的补丁文件都是使用gzip压缩的。

 

$gunzip ../setup-dir/ patch-2.4.21-rmk1.gz

 

2、然后进入你的内核源代码目录

 

$cd linux-2.4.21

 

3、打补丁

 

$patch –p1 < ../../setup-dir/patch-2.4.21-rmk1

 

打完补丁后,需要检查一下有没有拒绝执行的文件,即检查.rej文件的存在。使用命令:

 

$find . -name *.rej

 

如果发现,会将其输出到标准输出终端,默认屏幕。当然,你也可以采用重定向,输出到指定文件,比如reject。

 

$fine . -name *.rej >reject

 

然后可以查看reject的内容了。(T002

Linux命令200例:patch 用于将补丁文件应用到源码中 Linux patch 命令是一个非常强大的工具,用于将补丁文件应用到源码中。它可以在不重新编译整个源码的情况下,仅修改指定文件或目录中的特定部分。在软件开发中,经常会使用到 patch 命令来应用或创建补丁文件,以实现代码的增量更新和版本迁移。本文将详细介绍 patch 命令的使用方法,并提供8个实际应用的例子,帮助读者更好地理解和运用该命令。本文详细介绍了 Linux patch 命令的使用方法,并给出了8个实际应用的例子。 阅读详情

相关推荐

在Linux下制作补丁文件

综上所述,制作补丁文件可以在Linux系统中方便地对软件进行定制化修改和错误修复。通过遵循上述步骤,你可以生成和应用补丁文件,并在软件中引入自定义的修改。记住,在应用补丁文件之前,请确保备份原始的软件副本,并进行充分的测试和验证。在Linux系统中,制作补丁文件可以方便地对软件进行定制化修改或者进行错误修复。该命令将会根据补丁文件中的修改内容,对软件副本进行相应的修改。如果补丁文件应用成功,你将看到一系列的成功提示信息。你可以自定义补丁文件的名称,以及保存的路径。要应用补丁文件,你可以使用Git提供的。

KgyDeveloper的博客 436

linux笔记 diff及patch的制作与使用

此处的-p1参数,是因为新旧文件夹中的改动通常在new文件夹和old文件夹里,需要忽略首层的old和new文件夹,将内容物替换。empty 如果发现空文件,则删除,常见于需要删除旧文件夹中某个旧文件整体的情况,以及恢复补丁时删除之前新写的无效文件。empty 如果发现空文件,则删除,常见于需要删除旧文件夹中某个旧文件整体的情况,以及恢复补丁时删除之前新写的无效文件。默认为输出每个需要修改的代码块的前后3行,如需指定行数,则使用-uNUM,更改NUM为所需行数。

m0_56661101的博客 2753

DANN实战:用Python手把手教你实现对抗迁移学习(附完整代码)

本文通过Python实战教程,手把手教你实现DANN对抗迁移学习模型,以解决领域偏移问题。文章详细解析了领域对抗神经网络的核心机制,包括梯度反转层和领域判别器的构建,并提供了从数据准备、模型搭建到训练评估的完整代码,帮助开发者快速掌握这一强大的无监督领域自适应技术。

net55的博客 317

Linux下patch的制作和应用

 [转帖] Linux下patch的制作和应用2007年11月01日 星期四 15:00因为在u-boot移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。 学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者baidu搜索一下,然后选择有价值的资料,方法二是阅读man在线文档。完成收集工作,当

bisword的专栏 747

带标签的PHM2009齿轮箱数据集

PHM2009附加数据集—带标签的齿轮箱数据集,可用于测试算法

qq_39379705的博客 4873

行车记录仪 - 碰撞检测

功能需求 行车记录仪的核心功能是记录,大部分时候,行车记录仪都是在循环录制视频和音频,而设备的存储空间是有限的,因此录制机制一般是循环覆盖录制,如此一些重要的记录(例如:发生碰撞时的记录)就可能会被覆盖,为了避免这种情况的发生,行车记录仪设备就需要感知这些情况并做特殊处理(例如:备份相应时刻的录像数据)。 实现原理 碰撞检测是通过物理芯片G-sensor来实现的,加速度发生变化时G-sensor驱动会将加速度上报给应用层,应用层做相应处理。 G-sensor G-sensor(Gravity se

qazw9600的专栏 5216

Linux下diff,Patch的应用和制作方法介绍

Linux下Patch的应用和制作方法介绍 学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者baidu搜索一下,然后选择有价值的资料,方法二是阅读man在线文档。完成收集工作,当然最终要在自己的Linux上作实验,比较总结,消化吸收为自己的东西。要除去这么一种错误思想:一定要学全。要知道,一次学全是不可能的,只能先学习最为常用的,在以后不断实践的过程中逐步的

yyp872的专栏 993

Unity透明视频播放全攻略:AVPro Video插件实战与避坑指南

在游戏开发与交互式内容创作中,视频播放是常见的多媒体需求。其核心原理在于通过解码器将压缩的视频数据流转换为连续的图像帧,再经由图形API渲染至屏幕。这项技术的价值在于能够高效地呈现动态视觉内容,广泛应用于游戏过场动画、UI特效、AR/VR虚拟展示等场景。当需求进阶到需要背景透明的视频时,技术实现复杂度显著增加,这涉及到对视频Alpha通道的编码、解码与渲染管线的特殊处理。本文聚焦于Unity引擎中实现高质量透明视频播放的工程实践,深入解析了AVPro Video这一专业插件如何解决原生VideoPlayer

weixin_30368981的博客 376

Linux下Patch的应用和制作方法

因为在u-boot移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。 学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者baidu搜索一下,然后选择有价值的资料,方法二是阅读man在线文档。完成收集工作,当然最终要在自己的Linux上作实验,比较总结,消化吸收为自己的东西。要除去这么一种错误思想:一定要学全。要知道,一次

device的博客 308

2025年软件测试职业院校技能大赛—ERP管理平台-采购管理采购入库模块测试用例

竞赛对接软件测试相关标准,以“ERP管理平台” 为被测系统,围绕软件测试领域的主流技术及工具,考查选手面 对实际问题的综合分析能力,对测试文档、测试用例的设计能力, 对单元测试、自动化测试、性能测试、接口测试等测试工具及方 法的掌握程度,检验选手团队协作能力、组织规划能力、方法运用能力等。

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 401

CryoEM - 冷冻电镜 基于深度学习的 从头重构(Ab-initio Reconstruction) 开源项目 教程

冷冻电镜(CryoEM) 是一种成像方式,为蛋白质和其他生命基本组成部分的动态,提供独特的观察方式。从数百万噪声和随机取向的二维投影中,以计算效率高的方式,联合估计生物大分子的姿态、三维结构和构象异质性。

AGI 1556

Linux下Patch的应用和制作方法介绍 ---转载

<br />原文:http://linux.ccidnet.com/art/3067/20070418/1064163_1.html<br />因为在u-boot移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。 <br /> <br />学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者 baidu搜索一下,然后选择有价值的资料,方法二是阅读man在线文档。完成收集工作,当然最终要在自己的Linux上作实验,比较总结,消化吸收

zhiyuan_2007的专栏 458

GEE 案例分析:利用Landsat数据进行FAI、NDVI及CHLA分析并统计平均值(巢湖为例)

浮游藻类指数(FAI)、归一化植被指数(NDVI)及叶绿素a(CHLA)是水体环境监测的重要指标。本文利用Google Earth Engine(GEE)平台,基于Landsat 5和Landsat 8数据,进行水体藻类及植被监测。

此星光明博客 1336
上一篇: Linux的系统信号(signal)类型与机制
下一篇: 守护进程
tinnycloud
博客等级 码龄21年 9粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值