我們在升級Linux 內核的時候,難免會接觸到補丁的知識。下麵對如何生成補丁和如何打補丁作講解。 生成補丁: 製作 hello.c 和 hello_new.c 兩個文件如如下所示。 使用 diff -uN 命令 進行生成patch 至此,patch 已經創建完畢。 之後,我們進行使用 patch 命 ...
我們在升級Linux 內核的時候,難免會接觸到補丁的知識。下麵對如何生成補丁和如何打補丁作講解。
生成補丁:
製作 hello.c 和 hello_new.c 兩個文件如如下所示。
➜ diff ls hello.c hello_new.c hello_test.c hi.patch ➜ diff 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.patch ➜ diff 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.patch ➜ diff 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.patch ➜ diff 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 命令來進行查看。
保持更新,轉載請註明出處。