我们在升级Linux 内核的时候,难免会接触到补丁的知识。下面对如何生成补丁和如何打补丁作讲解。

生成补丁:

制作 hello.c 和 hello_new.c 两个文件如如下所示。

➜  diff ls
hello.c hello_new.c hello_test.c hi.patch
➜ diff cat hello.c
#include "stdio.h"
int main(int argc ,char **argv)
{
printf("Hello World");
}
➜ diff cat hello_new.c
#include "stdio.h"
int main(int argc ,char **argv)
{
printf("Hello World\n");
return ;
}

使用 diff  -uN 命令 进行生成patch

➜  diff diff -uN hello_new.c hello.c > hi.patch
➜ diff cat hi.patch
--- hello_new.c -- ::23.679704122 +
+++ hello.c -- ::59.190677641 +
@@ -, +, @@
#include "stdio.h"
int main(int argc ,char **argv)
{
- printf("Hello World\n");
- return ;
+ printf("Hello World");
}

至此,patch 已经创建完毕。

之后,我们进行使用 patch 命令 对 hello.c 文件进行打补丁。

➜  diff patch -p0 <hi.patch
patching file hello.c
Reversed (or previously applied) patch detected! Assume -R? [n] y
➜ diff cat hello.c
#include "stdio.h"
int main(int argc ,char **argv)
{
printf("Hello World\n");
return ;
}
➜ diff ls
hello.c hello.c.orig hello_new.c hello_test.c hi.patch
➜ diff cat hello.c.orig
#include "stdio.h"
int main(int argc ,char **argv)
{
printf("Hello World");
}
➜ diff cat hello.c
#include "stdio.h"
int main(int argc ,char **argv)
{
printf("Hello World\n");
return ;
}
➜ diff

可见,补丁已经成功应用,并且生成了 .orig 源文件。 --backup-if-mismatch  选项,可以不进行生成orig 文件。

➜  diff patch -p0 --no-backup-if-mismatch < hi.patch
patching file hello.c
Reversed (or previously applied) patch detected! Assume -R? [n] y
➜ diff ls
hello.c hello_new.c hello_test.c hi.patch
➜ diff cat hello.c
#include "stdio.h"
int main(int argc ,char **argv)
{
printf("Hello World\n");
return ;
}

diff 和 patch 命令介绍:

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

-pnum or --strip=num
Strip the smallest prefix containing num leading slashes from each file name found in the patch file. A sequence of one or more adjacent slashes is counted as a
single slash. This controls how file names found in the patch file are treated, in case you keep your files in a different directory than the person who sent out
the patch. For example, supposing the file name in the patch file was

/u/howard/src/blurfl/blurfl.c

setting -p0 gives the entire file name unmodified, -p1 gives

u/howard/src/blurfl/blurfl.c

without the leading slash, -p4 gives

blurfl/blurfl.c

and not specifying -p at all just gives you blurfl.c. Whatever you end up with is looked for either in the current directory, or the directory specified by the -d
option.

具体的使用说明,可以使用 man diff 和 man patch 命令来进行查看。

保持更新,转载请注明出处。

Linux 补丁生成与使用的更多相关文章

  1. Linux下生成patch和打patch

    转自:http://blog.csdn.net/dl0914791011/article/details/17299103 通过diff工具生成补丁, patch工具打上补丁. 在使用diff之前, ...

  2. linux下生成core dump文件方法及设置

    linux下生成core dump文件方法及设置    from:http://www.cppblog.com/kongque/archive/2011/03/07/141262.html core ...

  3. random and password 在Linux下生成crypt加密密码的方法,shell 生成指定范围随机数与随机字符串

    openssl rand -hex n (n is number of characters) LANG=c < /dev/urandom tr -dc _A-Z-a-z-0-9 | head ...

  4. linux c生成唯一文件名称

    linux c生成唯一文件名称可用mktemp()或mkstemp()函数

  5. 【linux】在linux上生成SSH-key 简单原理介绍+生成步骤

    1.首先什么是SSH Secure Shell (SSH) 是一个允许两台电脑之间通过安全的连接进行数据交换的网络协议.通过加密保证了数据的保密性和完整性.SSH采用公钥加密技术来验证远程主机,以及( ...

  6. linux 模拟生成 CAN 设备

    /************************************************************************************** * linux 模拟生成 ...

  7. 1.Linux下生成密钥

    1.Linux下生成密钥 ssh-keygen的命令手册,通过”man ssh-keygen“命令: 通过命令”ssh-keygen -t rsa“ 生成之后会在用户的根目录生成一个 “.ssh”的文 ...

  8. Linux中生成Core Dump系统异常信息记录文件的教程

    Linux中生成Core Dump系统异常信息记录文件的教程 http://www.jb51.net/LINUXjishu/473351.html

  9. linux c 生成uuid

    /********方法一**********/#include <stdio.h> #include <stdlib.h> #include <string.h> ...

随机推荐

  1. scala-02-基本数据类型-string-分支循环

    一, 基本数据类型 1, scala的数据类型和java类似, 不同的是scala中所有的类型都是引用类型的 Byte Short Int Long Char Float Double String ...

  2. Solidity字符串和函数

    字符串:需要使用双引号""或者单引号''括起来,例如:定义一个字符串变量:string name="jake":string字符串不能通过length方法获得长 ...

  3. 版本管理(二)之Git和GitHub的连接和使用

    首先需要注册登录GitHub:https://github.com 然后 ①:下载Git 先从Git官网,由于我的系统是64位的所以选择64-bit Git for Windows Setup htt ...

  4. webpack4使用mode优化开发环境配置

    @subject: webpack mode @author: leinov @date: 2018-11-29 mode webpack的 mode 配置用于提供模式配置选项告诉webpack相应地 ...

  5. IIS 是如何处理 ASP.NET 请求的

    #main{ width:1250px; } #mainContent{ width:915px } img#imgTop{ max-width:850px; } Web 服务器 VS Web 应用程 ...

  6. SQL - 先安装SQL2008 R2后安装AD导致无法正常登陆数据库(无法启动MSSQLSERVER)

    分析原因:安装AD后,系统改为使用域用户登陆,原先安装SQL时设置的“本地用户”信息已经修改,当前(域)用户没有权限访问MSSQLSERVER实例文件夹或整个SQL文件夹. 解决方法: 1.打开“服务 ...

  7. 3.C#知识点:is和as

    IS和AS 都是用于类型转换的操作. 但是这两个有什么区别呢? 简单的来说 is 判断成立则返回True,反之返回false.as 成立则返回要转换的对象,不成立则返回Null. 下面掏一手代码来说明 ...

  8. Maven包查询库

    第一个: http://search.maven.org/ 第二个: http://mvnrepository.com/artifact/aspectj/aspectjweaver

  9. Java虚拟机--垃圾收集器和内存分配

    垃圾收集器和内存分配 程序计数器.虚拟机栈.本地方法栈这三个区域和线程的生命周期一致,所以方法结束或者线程结束时,内存自然就跟着回收了.Java堆和方法区,只有在程序处于运行期间才能知道会创建哪些对象 ...

  10. 《码出高效 Java开发手册》第二章 面向对象

    码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding 第2章 面向对象 Object-Oriented Pro ...