扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
类unix操作系统有一个很有趣的特性就是源代码级的补丁包。在windows上我们打补丁都是运行一个可执行的程序,然后就可以把补丁打完了,这对于最终用户是非常方便的,但是对我们这些求知欲比较强的Linux fans来说就有点不过瘾了,因为我们不知道里面是怎么做的。而Linux的补丁就有趣多了,我们首先获得程序的源代码和对应的补丁文件,然后给源代码打补丁,产生新的源代码文件。然后再编译这个新的源代码文件,就获得了打过补丁的新程序了。
解释patch文件
我们可以使用diff命令加参数-ruN来比较两个文件并生成一个补丁文件。这个补丁文件会列出这两个不同版本文件的差异来。我们将通过一个特定例子来解释这个由diff命令生成的补丁文件(patch file)。
假定:我们对检查linux-2.2.13和linux-2.2.14这两个不同的版本的差别很感兴趣。
第一步,我们使用如下命令:
make distclean
这样可以在两个源代码目录中删去所有非文本文件。
然后我们继续第二步:
*****************************************************************************
diff -ruN linux-2.2.13 linux-2.2.14 >/tmp/patch-2.2.14
*****************************************************************************
COMMAND EXECUTION:
-r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,正如你所料,这种比较也是包括子目录中的文件的。
-N 选项表明如果一个文件存在于一个目录中,那么它就必须被认为是在这个目录中的,哪怕这个文件在对应的目录中是一个空文件。(举个例子,如果在老版本中有这么一个文件,但是在新版本中这个文件被去掉了,那么diff仍然会把它记录下来,我们打完补丁以后,在得到的新版本代码中,老版本的那个文件名仍然会存在,但是是一个空文件)
-u 选项指明正在使用的是统一的输出格式。
下面我们查看一下经过重定向后生成的补丁文件/tmp/patch-2.2.14,下面是我们从该文件中摘抄的一部分补丁信息:
*****************************************************************************
diff -ruN linux-2.2.13/arch/i386/kernel/signal.c
linux-2.2.14/arch/i386/kernel/signal.c
这里第一个版本的名字,linux-2.2.13是参考版本(就是旧版本),所有的在linux-2.2.14(新版本)中发现的问题都是和第一个版本相关的。
*****************************************************************************
DIFF HEADER:
diff命令会在补丁文件中记录这两个文件的首次创建时间,如下:
*****************************************************************************
*** linux-2.2.13/arch/i386/kernel/signal.c Tue Jun 8 01:14:20 1999
--- linux-2.2.14/arch/i386/kernel/signal.c Sun Jan 23 17:29:25 2000
*****************************************************************************
DIFF BODY:
diff 命令在这两个文件之间发现了3类差异。
a) 添加(addition):
这一行在旧版本的文件中没有,但是被添加到了新版本的文件中。
b) 置换(replacement):
在新版本文件中用连续的几行替换掉了旧版本文件中连续的几行。
c) 删除(deletion):
在旧版本文件中的一行在新版本文件中不再出现。
在每一种情况下,发生变化的行号都会被提示出来。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者