学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者baidu搜索一下,然后选择有价值的资料,方法二是阅读man在线文档。完成收集工作,当然最终要在自己的Linux上作实验,比较总结,消化吸收为自己的东西。要除去这么一种错误思想:一定要学全。要知道,一次学全是不可能的,只能先学习最为常用的,在以后不断实践的过程中逐步的丰富,最终达到比较高的水平。把握的原则是:日有所学,学以致用,用以促学。
首先介绍一下diff和patch。在这里不会把man在线文档上所有的选项都介绍一下,那样也没有必要。在99%的时间里,我们只会用到几个选项。所以必须学会这几个选项。
在这里以实例说明:
--- old/modules/pcitable Mon Sep 27 11:03:56 1999
+++ new/modules/pcitable Tue Dec 19 20:05:41 2000
如果使用参数-p0,那就表示从当前目录找一个叫做old的文件夹,在它下面寻找modules下的pcitable文件来执行patch操作。
如果使用参数-p1,那就表示忽略第一层目录(即不管old),从当前目录寻找modules的文件夹,在它下面找pcitable。这样的前提是当前目录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。当然,可以用相对路径,也可以用绝对路径。不过我一般习惯用相对路径。
-E选项说明如果发现了空文件,那么就删除它
-R选项说明在补丁文件中的“新”文件和“旧”文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)
下面结合具体实例来分析和解决,分为两种类型:为单个文件打补丁和为文件夹内的多个文件打补丁。
环境:在RedHat 9.0下面以armlinux用户登陆。
目录树如下:
|-- bootloader
|-- debug
|-- images
|-- kernel
|-- program
|-- rootfiles
|-- software
|-- source
|-- sysapps
|-- tmp
`-- tools
下面在program文件夹下面建立patch文件夹作为实验用,然后进入patch文件夹。
一、为单个文件进行补丁操作
1、建立测试文件test0、test1
[armlinux@lqm patch]$ cat>>test0<<EOF
> 111111
> 111111
> 111111
> EOF
[armlinux@lqm patch]$ more test0
111111
111111
111111
[armlinux@lqm patch]$ cat >>test1<<EOF
> 222222
> 111111
> 222222
> 111111
> EOF
[armlinux@lqm patch]$ more test1
222222
111111
222222
111111
2、使用diff创建补丁test1.patch
[armlinux@lqm patch]$ diff -uN test0 test1 > test1.patch
【注:因为单个文件,所以不需要-r选项。选项顺序没有关系,即可以是-uN,也可以是-Nu。】
[armlinux@lqm patch]$ ls
test0test1test1.patch
[armlinux@lqm patch]$ more test1.patch
************************************************************
patch文件的结构
补丁头
补丁头是分别由---/+++开头的两行,用来表示要打补丁的文件。---开头表示旧文件,+++开头表示新文件。
一个补丁文件中的多个补丁
一个补丁文件中可能包含以---/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。
块
块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。
块的缩进
块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。
块的第一列
+号表示这一行是要加上的。
-号表示这一行是要删除的。
没有加号也没有减号表示这里只是引用的而不需要修改。
************************************************************
***diff命令会在补丁文件中记录这两个文件的首次创建时间,如下***
--- test0 2006-08-18 09:12:01.000000000 +0800
+++ test1 2006-08-18 09:13:09.000000000 +0800
@@ -1,3 +1,4 @@
+222222
111111
-111111
+222222
111111
[armlinux@lqm patch]$ patch -p0 < test1.patch
patching file test0
[armlinux@lqm patch]$ ls
test0test1test1.patch
[armlinux@lqm patch]$ cat test0
222222
111111
222222
111111
3、可以去除补丁,恢复旧版本
[armlinux@lqm patch]$ patch -RE -p0 < test1.patch
patching file test0
[armlinux@lqm patch]$ ls
test0test1test1.patch
[armlinux@lqm patch]$ cat test0
111111
111111
111111
二、为多个文件进行补丁操作
1、创建测试文件夹
[armlinux@lqm patch]$ mkdir prj0
[armlinux@lqm patch]$ cp test0 prj0
[armlinux@lqm patch]$ ls
prj0test0test1test1.patch
[armlinux@lqm patch]$ cd prj0/
[armlinux@lqm prj0]$ ls
test0
[armlinux@lqm prj0]$ cat >>prj0name<<EOF
> --------
> prj0/prj0name
> --------
> EOF
[armlinux@lqm prj0]$ ls
prj0nametest0
[armlinux@lqm prj0]$ cat prj0name
--------
prj0/prj0name
--------
[armlinux@lqm prj0]$ cd ..
[armlinux@lqm patch]$ mkdir prj1
[armlinux@lqm patch]$ cp test1 prj1
[armlinux@lqm patch]$ cd prj1
[armlinux@lqm prj1]$ cat >>prj1name<<EOF
> ---------
> prj1/prj1name
> ---------
> EOF
[armlinux@lqm prj1]$ cat prj1name
---------
prj1/prj1name
---------
[armlinux@lqm prj1]$ cd ..
2、创建补丁
[armlinux@lqm patch]$ diff -uNr prj0 prj1 > prj1.patch
[armlinux@lqm patch]$ more prj1.patch
diff -uNr prj0/prj0name prj1/prj0name
--- prj0/prj0name 2006-08-18 09:25:11.000000000 +0800
+++ prj1/prj0name 1970-01-01 08:00:00.000000000 +0800
@@ -1,3 +0,0 @@
---------
-prj0/prj0name
---------
diff -uNr prj0/prj1name prj1/prj1name
--- prj0/prj1name 1970-01-01 08:00:00.000000000 +0800
+++ prj1/prj1name 2006-08-18 09:26:36.000000000 +0800
@@ -0,0 +1,3 @@
+---------
+prj1/prj1name
+---------
diff -uNr prj0/test0 prj1/test0
--- prj0/test02006-08-18 09:23:53.000000000 +0800
+++ prj1/test01970-01-01 08:00:00.000000000 +0800
@@ -1,3 +0,0 @@
-111111
-111111
-111111
diff -uNr prj0/test1 prj1/test1
--- prj0/test11970-01-01 08:00:00.000000000 +0800
+++ prj1/test12006-08-18 09:26:00.000000000 +0800
@@ -0,0 +1,4 @@
+222222
+111111
+222222
+111111
[armlinux@lqm patch]$ ls
prj0prj1prj1.patchtest0test1test1.patch
[armlinux@lqm patch]$ cp prj1.patch ./prj0
[armlinux@lqm patch]$ cd prj0
[armlinux@lqm prj0]$ patch -p1 < prj1.patch
patching file prj0name
patching file prj1name
patching file test0
patching file test1
[armlinux@lqm prj0]$ ls
prj1nameprj1.patchtest1
[armlinux@lqm prj0]$ patch -R -p1 < prj1.patch
patching file prj0name
patching file prj1name
patching file test0
patching file test1
[armlinux@lqm prj0]$ ls
prj0nameprj1.patchtest0
-------------------
总结一下:
单个文件
diff –uN from-file to-file >to-file.patch
patch –p0 < to-file.patch
patch –RE –p0 < to-file.patch
多个文件
diff –uNr from-docu to-docu>to-docu.patch
patch –p1 < to-docu.patch
patch –R –p1 <to-docu.patch
-------------------
三、应用
为内核打补丁。前面在创建交叉编译工具链时,其中有一步就是为内核打补丁。当时还不是特别了解,现在很清晰了。参考前面的文章《基于ARM+Linux嵌入式开发的开发工具链的建立》。
1、首先是解压,因为发布的补丁文件都是使用gzip压缩的。
$gunzip ../setup-dir/ patch-2.4.21-rmk1.gz
2、然后进入你的内核源代码目录
$cd linux-2.4.21
3、打补丁
$patch –p1 < ../../setup-dir/patch-2.4.21-rmk1
相关推荐
因为在u-boot移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。本文首介绍一下diff和patch。然后介绍了制作Patch为单个文件和多个文件进行补丁操作的方法。
Linux下的Patch工具是一种用于管理软件源代码差异和更新的实用程序,主要由两部分组成:`diff`和`patch`。这两个工具可以帮助开发者快速找出源代码之间的差异,并将这些差异应用到原始代码上,以便更新或回滚代码到...
- 将新生成的patch更新到目标OpenWrt的patches目录下,使用`make target/linux/update V=s`。 6. **修改已有Patch**: - 对于已经存在的patch文件进行修改,直接在对应的patch文件中进行编辑即可。如果需要对同一...
Linux操作系统可以根据其主要功能差异和发行组织来分类,也可以根据应用的嵌入式平台进行分类。 **第一层次分类**: 1. **标准Linux**: 基于官方维护的标准内核。 2. **μClinux**: 一种专门为无MMU(内存管理单元...
Linux下的RPM打包制作流程是将软件源代码转化为可供Linux系统安装的RPM包的过程,这一过程涉及到多个步骤和配置文件。RPM(Red Hat Package Manager)是一种广泛应用于Linux发行版的软件包管理器,它使得软件的安装...
Linux内核编译文档 根据提供的文件信息,本文档旨在...本文档提供了详细的Linux内核编译指南,包括rpmbuild工具的使用、SRPM和SPEC文件的应用、编译Linux内核、修改源代码和制作patch、应用编译好的RPM包等知识点。
本文档主要介绍了Linux内核移植、根文件系统制作和触摸屏相关的知识点。 1.1 Linux内核基础知识 在进行Linux内核移植之前,需要对Linux内核进行一定的了解。Linux内核的版本号可以从源代码的顶层目录下的Makefile...
1. 解压Linux-2.6.20源代码,并将2.6.20-at91.patch.gz应用到源代码中,使用`patch -p1`命令。 2. 修改Makefile文件,设置ARCH为arm,CROSS_COMPILE指向交叉编译器的路径。 3. 复制arch/arm/configs/at91rm9200ek_...
首先,需要解压缩linux-2.4.21.tar.gz文件,并应用patch-2.4.21-rmk1.gz补丁。然后,需要清理一下Makefile文件,并将ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa...
OpenWRT是一款基于Linux的路由器操作系统,旨在提供一个高度可定制和灵活的解决方案,满足不同用户的需求。本文档旨在总结OpenWRT的开发教程和补丁patch,帮助开发者和用户更好地理解和使用OpenWRT。 路由器配置 ...
Linux下patch的制作和应用** - **制作过程**:生成补丁文件。 - **应用方法**:将补丁应用到源代码。 **7. 初步探讨ARM调试技术** - **调试工具**:GDB、JTAG等。 - **调试技巧**:设置断点、查看变量值等。 **8....
完成以上步骤后,你将在 `$PREFIX` 路径下拥有一个完整的 ARM-Linux 交叉编译环境,可以用来编译针对 ARM 平台的 Linux 应用程序和库。记得在编译时指定 `-v` 选项来验证目标架构是否正确。如果需要编译其他库或应用...
在实际应用场景中,如果 `file1` 和 `file2` 不在同一目录下,补丁文件 `file3` 中将会包含文件的完整路径信息,以便在应用补丁时能够正确识别文件的位置。 #### 六、总结 `diff` 命令是一个强大且灵活的工具,...
* 使用RT-Linux的kernel-patch1.2对其进行修补,然后进行内核配置,配置工作是指在内核代码上稍做修改,即删除多余的内核支持选项,这样就会得到一个精巧实用的实时RT-Linux内核。 * 非实时部分的开发,使用QT-...
本文档主要介绍了如何一步步构建ARM-Linux交叉编译环境,这对于在非ARM平台上开发和编译针对ARM架构的应用程序至关重要。交叉编译允许你在x86或其他架构的主机上构建运行在ARM处理器上的Linux应用程序,而无需实际在...
- 使用`patch`命令应用补丁。 2. **配置内核以支持SquashFS:** - 使用`make menuconfig`进入内核配置界面。 - 在“Filesystems”选项中启用SquashFS支持,并选择将其编译到内核中。 - 在“Device Drivers”...
本文档主要介绍了如何构建ARM-Linux交叉编译环境,这在开发和调试针对ARM架构的Linux应用程序时非常关键。以下是构建过程的详细步骤: 1. **选择工具和版本** 首先,我们需要指定所使用的工具和库的版本。例如,...