zoukankan      html  css  js  c++  java
  • diff 命令用法--如何打补丁【原创--学习笔记】

    diff 命令用法

    1、”-u”:表示在比较结果中输出上下文中一些相同的行,这有利于人工定位

    2、“-r“:表示递归比较各个子目录下的文件

    3、“-N“:将不存在的文件当作空文件

    4、“-w“:忽略对空格的比较

    5、“-B“:忽略对空行的比较

    例如:假设Linux-2.6.22.6目录中是原始的内核,Linux-2.6.22.6_ok目录中是修改后的内核,可以使用以下命令制作补丁文件linux-2.6.22.6_ok.diff(原始目录在前,修改过的目录在后)

    diff  –urN -w -B  linux-2.6.22.6  linux-2.6.22.6_ok  >  linux-2.6.22.6.diff

    由于linux-2.6.22.6是标准的代码,可以从网上自由下载,要发布的linux-2.6.22.6_ok中所做的修改时,只需要提供补丁文件linux-2.6.22.6_ok.diff(它通常是很小的)

             patch 命令被用来打补丁----就是依据补丁文件来修改原始文件。比如对于上面的例子,可以使用以下命令将补丁文件linux-2.6.22.6_ok.diff 应用到原始目录linux-2.6.22.6上去。假设linux-2.6.22.6_ok.diff 和linux-2.6.22.6位于同一个目录下.

    cd  linux-2.6.22.6

    patch   -p1  <  ../linux-2.6.22.6_ok.diff

             patch 命令中最重要的选项是“-pn”: 补丁文件中指明了要修改的文件的路径,“-pn”表示忽略路径中第n个斜线之前的目录。

    如何打内核补丁

    make kernel_menuconfig 里面存在了打补丁的过程,在更新已打过的patch的话就需要先make clean ,再make menuconfig , 再make kernel_menuconfig, 此时就会打上补丁,那么想更新的话就把原来的补丁删了,再make kernel_menuconfig,然后再把新内核和改动的内核对比,再按照下面的方法打补丁即可

    内核打补丁后,需要再运行这个脚本

    diff-urNwB build_dir/linux-brcm5830_sxxx-prolin2/linux-3.6.5/drivers/video/backlight/pwm_bl.c pwm_bl.c > drivers-video-backlight-pwm_bl.c.patch

     

    补丁里必须在第一行加入diff打补丁命令

    diff -urNwB

    linux-3.6.5/drivers/video/backlight/pwm_bl.c linux-3.6.5/drivers/video/backlight/pwm_bl.c >

    drivers-video-backlight-pwm_bl.c.patch

    diff -urNa linux-3.0.56_old linux-3.0.56_new > out.patch

    perl spldiff.pl < usb.patch

    patch里就可以出现.orig

    这是做了拆分补丁的动作

    补丁里必须在第一行加入diff打补丁命令

    spldiff.pl代码:

     #use warnings;
     use strict;
     no strict 'refs';
     
     my %seen = (); 
     my $pf;
     
     while (<>) {
         if (/^diffs+S+s+.+?/(S+)/) {
             $pf = $1; 
             $pf =~ s///-/g;
             unless (exists $seen{"$pf"}) {
                 open("$pf", ">$pf.patch");
                 $seen{"$pf"} = 1;
             }   
         } else {
             s/(^---s).+?/(S+)/$1linux-3.6.5/$2.orig/;
             s/(^+++s).+?/(S+)/$1linux-3.6.5/$2/;
             print {"$pf"} $_; 
         }   
     }    
    make kernel_menuconfig 里面存在了打补丁的过程,在更新已打过的patch的话就需要先make clean ,
    再make menuconfig , 再make kernel_menuconfig, 此时就会打上补丁,那么想更新的话就把原来的补丁删了,
    再make kernel_menuconfig,然后再把新内核和改动的内核对比,再按照下面的方法打补丁即可 第一步 首先要提取一个干净的内核; svn co …. cp configs
    /brcm5830-prolin2-defconfig .config
    make menuconfig
    进入patch目录下把补丁都删了
    make V
    =s kernel_menuconfig
    这样就会在build_dir目录下产生一个干净的linux内核 第二步 产生一个服务器上的原有内核 svn co …. cp configs
    /brcm5830-prolin2-defconfig .config
    make menuconfig
    进入patch目录下把补丁都要保留
    make V
    =s kernel_menuconfig
    这样就会在build_dir目录下产生一个有patch提交过的linux内核 第三步 注意: 对比服务器的内核和原来的内核的区别,如果你所需要修改的文件原来的内核中没有,那么直接打补丁即可,如果所要修改的内核文件已经有了补丁,那么就要更新这个补丁即可。 diff
    -urNa linux-3.0.56_old linux-3.0.56_new > out.patch 打补丁命令 perl spldiff.pl < out.patch 拆分补丁,生成你所需要的补丁
    欢迎交流
    如有转载请注明出处

    新浪博客:http://blog.sina.com.cn/u/2049150530
    博客园:http://www.cnblogs.com/sky-heaven/
    知乎:http://www.zhihu.com/people/zhang-bing-hua

  • 相关阅读:
    OSCP Learning Notes Buffer Overflows(3)
    OSCP Learning Notes Buffer Overflows(5)
    OSCP Learning Notes Exploit(3)
    OSCP Learning Notes Exploit(4)
    OSCP Learning Notes Exploit(1)
    OSCP Learning Notes Netcat
    OSCP Learning Notes Buffer Overflows(4)
    OSCP Learning Notes Buffer Overflows(1)
    OSCP Learning Notes Exploit(2)
    C++格式化输出 Learner
  • 原文地址:https://www.cnblogs.com/sky-heaven/p/4514099.html
Copyright © 2011-2022 走看看