利用 patch 更新原始码

在前面介绍如何进行套件的升级,这是很重要的喔!那假如我是以 Tarball 来进行某个套件的安装,那么是否当我要升级这个套件时,就得要下载这个套件的完整全新的 Tarball 呢?举个例子来说,鸟哥有个讨论区在 http://phorum.vbird.org 这个网址,这个讨论区是以 phpBB 这个套件来架设的,而鸟哥的讨论区版本为 phpbb2.0.1.tar.gz ,目前( 2004/04/10 )最新释出的版本则是phpbb2.0.8.tar.gz 。那我是否需要下载全新的 phpbb2.0.8.tar.gz 这个档案来更新原本的旧程序呢?
  事实上,当我们发现一些套件的漏洞,通常是某一段程序代码写的不好所致。因此,所谓的『更新原始码』常常是只有更改部分档案的小部分内容而已。既然 如此的话,那么我们是否可以就那些被更动的档案来进行修改可以咯?也就是说,旧版本到新版本间没有更动过的档案就不要理他,仅将有修订过的档案部分来处 理即可。这有什么好处呢?首先,没有更动过的档案的目标文件( objectfile )根本就不需要重新编译,而且有更动过的档案又可以利用 make 来自动 update ( 更新 ),如此一来,呵呵!我们原先的设定( makefile 档案里面的规则 )将需要重新改写或侦测!呵呵!可以节省很多宝贵的时间呢( 例如后续章节会提到的核心的编译! )
  从上面的说明当中,我们可以发现,如果可以将旧版的原始码数据改写成新版的版本,那么就能直接编译了,而不需要将全部的新版 Tarball 重新下载一次呢!可以节省频宽与时间说!那么如何改写原始码?难道要我们一个档案一个档案去参考然后修订吗?当然没有这么没人性!我们在正规表示法的时候有提到一个比对两个档案的指令,那就是 diff ,这个指令可以将『两个档案之间的差异性列出来』呢!那我们也知道新旧版本的档案之间,其实只有修改一些程序而已,那么我们可以透过diff 比对出新旧版本之间的文字差异,然后再以相关的指令来将旧版的档案更新吗?!呵呵!当然可以啦!那就是 patch 这个指令啦!很多的套件开发商在更新了原始码之后,几乎都会释出所谓的patch file,也就是直接将原始码 update 而已的一个方式喔!我们底下以一个简单的范例来说明给您了解喔!
  假设我们有两个档案,分别是 expatch.old 与 expatch.new ,他们的内容是这样的:
 [guest@test guest]# vi expatch.old

   echo "check your postfix's body and header drop settings"
   echo "postmap -q - regexp:header_checks < header_checks"
   postmap -q - regexp:header_checks < header_checks
   echo "postmap -q - regexp:body_checks < body_checks"
   postmap -q - regexp:body_checks < body_checks
   [guest@test guest]# vi expatch.new
   echo "check your postfix's body and header drop settings"
   echo "postmap -q - regexp:header_checks < header_checks This's right"
   postmap -q - regexp:header_checks < header_checks
   echo "postmap -q - regexp:body_checks < body_checks This's right"
   postmap -q - regexp:body_checks < body_checks
   两个档案的不同点在于:
   [guest@test guest]# diff expatch.old expatch.new
   2c2
   < echo "postmap -q - regexp:header_checks < header_checks"
   ---
   > echo "postmap -q - regexp:header_checks < header_checks This's right"
   4c4
   < echo "postmap -q - regexp:body_checks < body_checks"
   ---
   > echo "postmap -q - regexp:body_checks < body_checks This's right"
 
上面显示出两个档案的不同点,详细的意义请参考正规表示法那个章节的介绍。 好了,假如我以『diff -c expatch.old expatch.new 』以及上面显示的信息,做成一个档案,内容是这样的:
[guest@test guest]# vi expatch.patch
*** expatch.old 2004-04-09 14:22:49.000000000 +0800
--- expatch.new 2004-04-09 14:23:18.000000000 +0800
2c2
< echo "postmap -q - regexp:header_checks < header_checks"
---
> echo "postmap -q - regexp:header_checks < header_checks This's right"
4c4
< echo "postmap -q - regexp:body_checks < body_checks"
---
> echo "postmap -q - regexp:body_checks < body_checks This's right"
注意到,这个档案的第一行显示出旧版本的文件名,而第二行则为新版本的档名与时间,第三行以后则是两个档案的差异性。那么我们将以 patch 来进行更新,将 expatch.old 更新到 expatch.new 看看。patch 的基本语法是这样的:
patch -p数字 < patch_file
特别留意那个 -p数字,那是与 patch_file 里面列出的文件名有关的信息。假如在 patch_file 第一行写的是这样:
*** /home/guest/example/expatch.old
那么当我下达『 patch -p0 < patch_file 』时,则更新的档案是『 /home/guest/example/expatch.old
』,如果『 patch -p1 < patch_file』,则更新的档案为『home/guest/example/expatch.od』,如果
『patch -p4 < patch_file』则更新『expatch.old』,也就是说, -pxx 那个 xx 代表『拿掉几个斜线(/)』
的意思!这样可以理解了吗?!好了,那么我要开始来更新我的 expatch.old 了,可以这样搞定:
[guest@test guest]# patch -p0 < expatch.patch
# 注意喔,这个时候我的工作目录底下会存在 expatch.old 才对!
# 然后立刻察看一下,您会发觉, expatch.new 与 expatch.old 变成一模一样的了!很容易了解吧!上面三个档案您可以在底下的网址取得:
http://linux.vbird.org/download/books/basic/source_code/expatch.tgz加油的啦!另外,如果您是以 patch 更新原始码,那么记得,您可能必须要重新编译,并且重新install 才算成功更新喔!并不是 patch 就好了!因为 patch 的功能主要仅只是更新原始码档案而已!
切记切记!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值