如何将补丁文件应用到我的Linux/UNIX源代码

时间:2020-01-09 10:37:14  来源:igfitidea点击:

可以在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)