如何将补丁文件应用到我的Linux/UNIX源代码
可以在Linux中使用up2date或yum命令修补二进制软件包。
我想知道是否有办法将补丁文件应用于Linux/UNIX之类的操作系统源树上的已下载源代码?
Linux和UNIX源软件通常带有安全性和其他补丁。
您可以从Internet或项目主页下载它们。
有一个称为patch的命令将差异文件或补丁应用到原始源代码树。
patch
命令获取一个包含由diff程序生成的差异列表的补丁文件patchfile,并将这些差异应用于一个或多个原始文件,从而生成修补版本。
通常,打补丁的版本会代替原始版本。
补丁命令语法
基本语法如下:
$ patch < patch.file $ patch source.code.file < patch.file $ patch -p LEVEL < {/path/to/patch/file}
要应用补丁,可以在shell中运行以下命令:
$ patch < /path/to/file
在此示例中,使用patch.diff文件修补foo.c:
$ patch foo.c < patch.diff
可以使用-R选项撤消或反转补丁:
$ patch -R < /path/to/file
如何创建补丁?
要创建补丁,可以运行以下diff命令:
$ diff -u oldfile-name-here newfile-name-here > patch.diff
示例:在类似Linux或Unix的系统上为hello.c示例程序创建和应用补丁
创建hello.c,如下所示:
#include<stdio.h> main(){ printf("Hello, world!\n"); }
复制hello.c(或您要修改的文件);这两个文件必须位于同一目录中,尽管使用cp命令可以位于任何目录中:
$ cp hello.c hello-new.c
编辑文件hello-new.c以根据需要进行设置。
在此示例中,我通过添加main()的返回值来修复一些编译器警告:
#include<stdio.h> int main(void){ printf("Hello, world!\n"); return 0; }
接下来,使用命令diff创建一个名为hello.patch的统一diff补丁文件:
$ diff -u hello.c hello-new.c > hello.patch
要查看补丁,请使用cat命令,如下所示:
$ cat hello.patch
输出示例:
--- hello.c 2014-04-29 17:59:49.000000000 +0530 +++ hello-new.c 2014-04-29 18:00:43.000000000 +0530 @@ -1,5 +1,6 @@ #include<stdio.h> -main(){ +int main(void){ printf("Hello, world!\n"); + return 0; }
要从hello.patch应用补丁,请输入:
### The hello.patch patchfile knows the name of the file to be patched ## patch < hello.patch
输出示例:
patching file hello.c
最后,这是我更新和修补的hello.c:
$ cat hello.c
输出示例:
#include<stdio.h> int main(void){ printf("Hello, world!\n"); return 0; }
您现在可以编译程序:
$ cc hello.c -o hello
如下运行:
$ ./hello
输出示例:
Hello, world!
关于在整个源代码树上工作的说明
首先,复制源树:
## Original source code is in lighttpd-1.4.35/ directory ## $ cp -R lighttpd-1.4.35/ lighttpd-1.4.35-new/
从CD转到lighttpd-1.4.35-new目录,然后根据您的要求进行更改:
$ cd lighttpd-1.4.35-new/ $ vi geoip-mod.c $ vi Makefile
最后,使用以下命令创建补丁:
$ cd .. $ diff -rupN lighttpd-1.4.35/ lighttpd-1.4.35-new/ > my.patch
您可以使用my.patch文件通过上述patch命令在另一台计算机/服务器上修补lighttpd-1.4.35源代码:
patch -p1 < my.patch
有关更多信息和用法,请参见patch和其他命令的手册页-bash(1)