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

生成补丁:

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

  1. diff ls
  2. hello.c hello_new.c hello_test.c hi.patch
  3. diff cat hello.c
  4. #include "stdio.h"
  5. int main(int argc ,char **argv)
  6. {
  7. printf("Hello World");
  8. }
  9. diff cat hello_new.c
  10. #include "stdio.h"
  11. int main(int argc ,char **argv)
  12. {
  13. printf("Hello World\n");
  14. return ;
  15. }

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

  1. diff diff -uN hello_new.c hello.c > hi.patch
  2. diff cat hi.patch
  3. --- hello_new.c -- ::23.679704122 +
  4. +++ hello.c -- ::59.190677641 +
  5. @@ -, +, @@
  6. #include "stdio.h"
  7. int main(int argc ,char **argv)
  8. {
  9. - printf("Hello World\n");
  10. - return ;
  11. + printf("Hello World");
  12. }

至此,patch 已经创建完毕。

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

  1. diff patch -p0 <hi.patch
  2. patching file hello.c
  3. Reversed (or previously applied) patch detected! Assume -R? [n] y
  4. diff cat hello.c
  5. #include "stdio.h"
  6. int main(int argc ,char **argv)
  7. {
  8. printf("Hello World\n");
  9. return ;
  10. }
  11. diff ls
  12. hello.c hello.c.orig hello_new.c hello_test.c hi.patch
  13. diff cat hello.c.orig
  14. #include "stdio.h"
  15. int main(int argc ,char **argv)
  16. {
  17. printf("Hello World");
  18. }
  19. diff cat hello.c
  20. #include "stdio.h"
  21. int main(int argc ,char **argv)
  22. {
  23. printf("Hello World\n");
  24. return ;
  25. }
  26. diff

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

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

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. Leetcode 746. Min Cost Climbing Stairs

    思路:动态规划. class Solution { //不能对cost数组进行写操作,因为JAVA中参数是引用 public int minCostClimbingStairs(int[] cost) ...

  2. [error] 1507#0: *22 FastCGI sent in stderr: "Primary script unknown" while reading response header from upstream, client: 10.0.0.1, server: www.wordpress.com, request: "GET /info.p

    字体比较小,如果你遇到这个问题请仔细的把下面的总结看完. 环境:CentOS6.7.2.6.32-573.el6.x86_64.nginx1.12.2 .php5.5.38 问题:nginx能解析静态 ...

  3. SQL-结构化查询语言(2)

    使用explain查询select查询语句的执行计划 mysql> explain select * from student where Sname='金克斯'\G ************* ...

  4. set集合容器(常用的使用方法总结)

     关于C++STL中set集合容器的学习,看别人的代码一百遍,不如自己动手写一遍. 构造set集合容器的目的是为了去重+排序+快速搜索.由于set集合容器实现了红黑树多的平衡二叉检索树的数据结构,在插 ...

  5. AWK工具的用法

    基本格式 awk '{commands}' filename 或者 stdin | awk '{commands}' 以下,均简写为awk '{commands}'的形式 commands的用法 co ...

  6. ASP.NET MVC显示UserControl控件(扩展篇)

    昨晚Insus.NET有怀旧一下<念念不忘,ASP.NET MVC显示WebForm网页或UserControl控件>http://www.cnblogs.com/insus/p/3641 ...

  7. 关于ASPxComboBox通过ClientInstanceName,js获取不到控件的问题

    今天突然遇到一个很奇葩的问题 ASPxComboBox中设置了ClientInstanceName.但是通过cmbOrganization.GetValue()获取不到值. 报错cmbOrganiza ...

  8. LINQ查询操作符 LINQ学习第二篇

    一.投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: using (NorthwindDataCo ...

  9. [日常] C语言中的字符数组和字符串

    c语言字符数组和字符串:1.存放字符的数组称为字符数组 char str[]2.'\0'也被称为字符串结束标志3.由" "包围的字符串会自动在末尾添加'\0'4.逐个字符地给数组赋 ...

  10. Ubuntu安装完成后设置root密码

    安装完ubuntu后没有默认的root密码,如果要设置root密码需要进行如下步骤: 1 sudo passwd 2 连续输入两次新密码