Linux 補丁生成與使用


我們在升級Linux 內核的時候,難免會接觸到補丁的知識。下面對如何生成補丁和如何打補丁作講解。

生成補丁:

制作 hello.c 和 hello_new.c 兩個文件如如下所示。

diff ls
hello.c  hello_new.c  hello_test.c  hi.patchdiff cat hello.c 
#include "stdio.h"
int main(int argc ,char **argv)
{
    printf("Hello World");
}
➜  diff cat hello_new.c 
#include "stdio.h"
int main(int argc ,char **argv)
{
    printf("Hello World\n");
    return 0;
}

使用 diff  -uN 命令 進行生成patch 

diff diff -uN hello_new.c hello.c > hi.patchdiff cat hi.patch 
--- hello_new.c    2018-07-17 16:58:23.679704122 +0800
+++ hello.c    2018-07-17 16:57:59.190677641 +0800
@@ -1,6 +1,5 @@
 #include "stdio.h"
 int main(int argc ,char **argv)
 {
-    printf("Hello World\n");
-    return 0;
+    printf("Hello World");
 }

至此,patch 已經創建完畢。

 之后,我們進行使用 patch 命令 對 hello.c 文件進行打補丁。

diff patch -p0 <hi.patch 
patching file hello.c
Reversed (or previously applied) patch detected!  Assume -R? [n] y
➜  diff cat hello.c
#include "stdio.h"
int main(int argc ,char **argv)
{
    printf("Hello World\n");
    return 0;
}
➜  diff ls
hello.c  hello.c.orig  hello_new.c  hello_test.c  hi.patchdiff cat hello.c.orig 
#include "stdio.h"
int main(int argc ,char **argv)
{
    printf("Hello World");
}
➜  diff cat hello.c
#include "stdio.h"
int main(int argc ,char **argv)
{
    printf("Hello World\n");
    return 0;
}
➜  diff 

可見,補丁已經成功應用,並且生成了 .orig 源文件。 --backup-if-mismatch  選項,可以不進行生成orig 文件。

diff patch -p0 --no-backup-if-mismatch < hi.patch 
patching file hello.c
Reversed (or previously applied) patch detected!  Assume -R? [n] y
➜  diff ls
hello.c  hello_new.c  hello_test.c  hi.patchdiff cat hello.c 
#include "stdio.h"
int main(int argc ,char **argv)
{
    printf("Hello World\n");
    return 0;
}

diff 和 patch 命令介紹:

1、diff
--------------------
NAME
       diff - find differences between two files
SYNOPSIS
       diff [options] from-file to-file
--------------------
簡單的說,diff的功能就是用來比較兩個文件的不同,然后記錄下來,也就是所謂的diff補丁。語法格式:diff 【選項】 源文件(夾) 目的文件(夾),就是要給源文件(夾)打個補丁,使之變成目的文件(夾),術語也就是“升級”。下面介紹三個最為常用選項:
-r 是一個遞歸選項,設置了這個選項,diff會將兩個不同版本源代碼目錄中的所有對應文件全部都進行一次比較,包括子目錄文件。
-N 選項確保補丁文件將正確地處理已經創建或刪除文件的情況。
-u 選項以統一格式創建補丁文件,這種格式比缺省格式更緊湊些。
2、patch
------------------
NAME
       patch - apply a diff file to an original
SYNOPSIS
       patch [options] [originalfile [patchfile]]
       but usually just
       patch -pnum <patchfile>
------------------
簡單的說,patch就是利用diff制作的補丁來實現源文件(夾)和目的文件(夾)的轉換。這樣說就意味着你可以有源文件(夾)――>目的文件(夾),也可以目的文件(夾)――>源文件(夾)。下面介紹幾個最常用選項:

-pnum or --strip=num
Strip the smallest prefix containing num leading slashes from each file name found in the patch file. A sequence of one or more adjacent slashes is counted as a
single slash. This controls how file names found in the patch file are treated, in case you keep your files in a different directory than the person who sent out
the patch. For example, supposing the file name in the patch file was

/u/howard/src/blurfl/blurfl.c

setting -p0 gives the entire file name unmodified, -p1 gives

u/howard/src/blurfl/blurfl.c

without the leading slash, -p4 gives

blurfl/blurfl.c

and not specifying -p at all just gives you blurfl.c. Whatever you end up with is looked for either in the current directory, or the directory specified by the -d
option.

具體的使用說明,可以使用 man diff 和 man patch 命令來進行查看。

保持更新,轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM