Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2006902
  • 博文数量: 369
  • 博客积分: 10093
  • 博客等级: 上将
  • 技术积分: 4271
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-21 00:59
文章分类

全部博文(369)

文章存档

2013年(1)

2011年(2)

2010年(10)

2009年(16)

2008年(33)

2007年(146)

2006年(160)

2005年(1)

分类: LINUX

2006-10-16 22:39:11

引子:
小时侯,家里都不富裕,常常是一件衣服,哥哥姐姐穿完就送给弟弟妹妹穿。时间久了,衣服上总是会磨出些洞洞,为了节省,勤劳的母亲们总是想方设法地找些布来修补好,首先做到的就是能遮羞和御寒了,其次如果母亲的艺术细胞比较发达,还总是能搞出些花样出来,虽破衣不是锦,却还是能生出花来。在小学的时侯,记得大家的屁股上多半会多出两个眼睛,有的膝盖上也会显得有些另类,直到中学,补丁衣服才渐渐地走出我的生活。事实上,高中三年,虽然没有再穿补丁衣服,可也没有买几件衣服。一方面是因为学校要求在学校只能穿校服,二来还是生活比较拮据,没有额外的钱来购置这些相对奢侈的东西,再者嘛,就是个人也不怎么修边幅,很单纯还略带些傻气的那种男生,华仔所谓的笨小孩就是指我这种吧!
似乎跑题了!?
经过我上面的一通解释,你们也该明白什么是补丁和何为“打补丁”了吧?
用过Windows操作系统的人想必都听说过“打补丁”,因为Windows的漏洞实在太多,所以也就免不缝缝补补了。也许你会问Linux也许要打补丁么?哈哈,不要奇怪,人无完人,事无俱细,当然“打补丁”也不是Windows的专利了。
Linux下的补丁和Windows下的补丁不尽相同:首先,windows下的补丁,一般都为二进制格式的补丁,而Linux系统中的软件因为一般都是以源码形式发布,所以针对源码的补丁占了绝大部分,本问所要讨论的补丁也指这种;其次,补丁的性质不同,Windows的补丁多为实实在在的修补软件漏洞,Linux则不同,有些补丁确实是为了做到“锦上添花”,而不仅仅是“雪中送炭”。
介绍完了概念,总算可以切入正题了。
本文将用烹调书的格式,手把手教你如何给软件“打补丁”(如果有幸手把手教美女如果打补丁,那简直是... ...,哈哈,停止YY,还是面对现实吧!)。
工作环境:
配备有Linux操作系统的电脑一台,必须有电,而且你有这个系统上的一个用户,还必须有编辑器,gcc,diff,patch等等,总之需要一个完备的Linux开发环境,发现自己真是罗嗦,婆婆妈妈的,对了,还需要有个能看本文的浏览器!:(还有,你需要会用C写“Hello world!”程序,奇怪了,怎么会有臭鸡蛋的气味呢?先不管了,等会儿再吃!
准备工作:
在您(称呼都换了,以示对您老人家的尊重)的系统上,准备如下文件:
file: hw.c

#include

int main(int argc, char *argv[])
{
        printf("Hello World!\n");

        return 0;
}
先编译运行一下,
xiaosuo@gentux hw $ gcc hw.c
xiaosuo@gentux hw $ ./a.out
Hello World!
哦,真牛,都会写Hello world程序了!
开始工作:
上面的程序不够酷,现在随便一个学生上了一节编程课后,都可以照着书上敲出一段类似代码,一点儿新意都没有。哈哈,有了,我用的是Linux,而不是那个号称只有傻瓜才会去用的Windows,终于找到可以炫耀的一点点资本了。可怎么更改呢?我迅速地用手转着我那和木瓜一样的脑袋,我想啊想,看呀看,哦,似乎明白了,原来以上的代码只是打印出了引号里面的内容,如果我在其中加入一些东西,它也应该能被打印出来的。马上开工,保险起见,备份一个先(多好的工作习惯啊):
xiaosuo@gentux hw $ cp hw.c hw.c.orig
xiaosuo@gentux hw $ ls
a.out  hw.c  hw.c.orig
备份的文件被我取名为hw.c.orig,多专业啊,告诉你吧,我都是从debian那里学来的,嘿嘿!修改hw.c成如下模样:
xiaosuo@gentux hw $ cat hw.c

#include

int main(int argc, char *argv[])
{
        printf("Hello Linux World!\n");

        return 0;
}
小心翼翼地编译运行一下试试看:
xiaosuo@gentux hw $ gcc hw.c
xiaosuo@gentux hw $ ./a.out
Hello Linux World!
简直帅呆了,酷毙了,太佩服自己的智商了,哦耶!兴奋之余,当然也不免要宣扬一番自己的“Hello Linux World!”程序。这时,同学们纷纷提出让我帮忙改造他们的程序,我当然欣然答应了。我修啊改啊,改啊修啊。咦,这个工作好像很无聊啊,我为什么不给他我自己的程序呢?哦,明白了,原来老师教导我们说不要抄袭,那么让什么来替我做这些初来新鲜,多了恶心的重复性劳动呢?我思维的骏马又开始挣脱了缰绳四处驰骋,谁家的马没栓好啊?把我刚洗的衣服都踩坏了,又要穿带补丁的了,郁闷!他这一嚷嚷,我也“吁... ...‘的一声,刹住了车。对啊,衣服可以打补丁,软件当然也可以了。可是补丁的英文单词是什么来着?又不好意思问别人,自己鬼鬼祟祟、偷偷摸摸地的打开了“星际译王”(Linux下的一个类似金山词霸的词典软件,和那个叫“星际”的游戏没有太大关系),哦,原来这个单词叫patch。看看系统中有没有这个家伙,
xiaosuo@gentux hw $ pat
patch    pathchk
呵呵,果真有,man一下看看怎么用,输入了man patch之后,发现自己犯了个错误,那些说明都是NND米国文字,还如同懒婆娘的“裹脚布”(不要告诉我你不知道这个是啥),又臭又长!嘿嘿,幸好我还有google可用,勾了一会儿之后,终于小有所成,还连带发现了patch的姊妹diff。哈哈,这下世界完美了。小试一下牛刀:
xiaosuo@gentux hw $ diff -urNp hw.c.orig hw.c > hw.c-01.patch
xiaosuo@gentux hw $ cat hw.c-01.patch
--- hw.c.orig   2006-10-16 20:46:35.000000000 +0800
+++ hw.c        2006-10-16 20:48:38.000000000 +0800
@@ -3,7 +3,7 @@

 int main(int argc, char *argv[])
 {
-       printf("Hello World!\n");
+       printf("Hello Linux World!\n");

        return 0;
 }
xiaosuo@gentux hw $ cp hw.c hw.c.orig2
xiaosuo@gentux hw $ cp hw.c.orig hw.c
xiaosuo@gentux hw $ patch -p0 < hw.c-01.patch
patching file hw.c
xiaosuo@gentux hw $ cat hw.c

#include

int main(int argc, char *argv[])
{
        printf("Hello Linux World!\n");

        return 0;
}
xiaosuo@gentux hw $ gcc hw.c
牛刀果真好用,用这个来杀鸡,简直让人爽歪歪(希望那个叫什么哇哈哈的不要告我)!然后我就把这个补丁文件分发给大家,并告诉他们如我这样炮制,结果大家一会儿就打好了补丁,并成功地运行了“Hello Linux World!”程序,大家对我的敬仰之情就开始有如滔滔江水绵延不决... ...(以下作者省略200字)。
很庆幸的是我还能找到北极星,其实是多亏今晚是历史少有的晴天,并且白天下过雨,将弥留在天际的尘埃都给解决了,即使这样,可还是费了我老半天的工夫,都是小时侯《自然》(不知道您老人家有没有学过,这是一门开在小学,讲科学的一门课程,里面涵盖了物理,化学,地理等基本知识)没有学好。我决心再给这个程序加点儿什么东西,于是我又翻开了某人写的c语言编程的书籍,其实就是我们的课本。恭喜我吧,都会自学了!
把头埋在了书里,当我再次抬起我那尊贵的头颅的时侯,我才发现书都被口水浸透了,四下张望了以下,还好没人发现这里有什么灵异的时间正在发生,于是乎我就已迅雷不及掩耳盗铃之势从课桌下面找出一个纸团抹了脸和书(书和脸?)。
求得真经之后,我便收拾了行囊,开始向宿舍进军。路过几个同学的课桌的时侯,发现他们看我的表情都有些怪异,我暗想走自己的路,让他们忌妒去吧!
到寝室后,发现其他人都还没有回来,也好,正好给他们一个惊喜。打开电脑,又开始敲代码!
跌跌撞撞地终于写完了自己的第一个function,

#include

void func(void)
{
        printf("I am in function.\n");

        return;
}

int main(int argc, char *argv[])
{
        printf("Hello Linux World!\n");
        func();

        return 0;
}
,运行成功后煞是兴奋啊!同学回来后,笑着对我说:“小子,墨水吃了不少啊?”,初以为夸自己呢,后来才知道原来自己满脸和满嘴的墨水,想必刚才是用纸抹口水的时侯沾染上的,汗一个,为自己,也为那些刚才看到自己的同学。当同学们看完自己的程序,还是敬佩有加的。
小结:
打补丁 patch -pN
生成补丁
diff -urNp >xx.patch
反打补丁
patch -RE
补丁格式:
 1 --- hw.c.orig   2006-10-16 20:46:35.000000000 +0800
被补文件的原始文件的文件名和文件最后修改日期
 2 +++ hw.c        2006-10-16 20:48:38.000000000 +0800
被补文件的文件名和文件最后修改日期
 3 @@ -3,7 +3,7 @@
这个是小结标志,涵义依次为原始的代码起始行和行数,修改后的起始行和行数,这个是包括了上下文的。
 4
 5  int main(int argc, char *argv[])
 6  {
以上三行为patch文件摘录的此小节上下文,一般都为三行,为以后发生了行号偏移量是使用,当然还有检查要补文件是否正确的功能。
 7 -       printf("Hello World!\n");
被删除的代码,patch文件是以行为基本的单位的,所以即使你在一个行中添加了某个字符,它还是会以为你改变了整行的,其实也是你改变了整行:)
 8 +       printf("Hello Linux World!\n");
这行当然是添加的行了。
 9
10         return 0;
11  }
明白了patch文件的格式,什么通过直接修改patch文件来拆分补丁,或者修改补丁等工作就很容易了,我都会自学了,您们也应该会了吧?
终结:
没想到写出来变成了这个样子,技术小小说?还是笑话?随你怎么想了,开心就好!
阅读(1269) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~