我們在升級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 命令介紹:
-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 命令來進行查看。
保持更新,轉載請注明出處。