`
happmaoo
  • 浏览: 4333703 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用diff和patch进行简单的文件版本管理

阅读更多

在Unix系统下,维护源码版本可以使用很多方法,其中最常用的当然是大名鼎鼎的CVS,但实际上,简单的版本维护工作并没有必要使用复杂的CVS等专门的版本维护工具,Unix标配中的diff和patch工具就完全可以完成代码的简单备份和升级工作。

diff 以"行"为单位比较两个文本文件(也可以是目录比较),并将不同之处以某种格式输出到标准输出上;patch可以读入这种输出,并按照一定指令使源文件 (目录)按照目标文件(目录)更新。Linux内核源码就是按照这种方式保持更新的,我们在www.kernel.org上可以下载到最新内核的 patch文件的bzip2包。本文以gnudiffutils 2.7和patch 2.5为例介绍diff和patch工具的使用。

1.diff

diff 既可以用来比较两个文件,也可以用来比较两个目录中每个文件。使用-r(--recursive)参数时还可以在目录中嵌套比较。比较目录时除比较同名文 件外,对不同名的文件当成新文件处理。对于比较C程序文件,diff还提供了专门的参数(-p,--show-c-function)来标识不同之处所在 的函数名。

diff的输出格式有三种:列举方式、命令模式和上下文模式,其中命令模式有分为两种:ed命令格式和RCS(Revision Control System,版本控制系统)命令格式,上下文模式也按格式分为老版和新版两种。看下面的例子就能基本清楚各个格式的区别:



命令格式记录的是从test1更新到test2所需要执行的命令,而上下文模式通常可读性更好一些,它所记录的主要是二者的差异,通常还记录所需修改部分的上下几行(可配置)内容以供比较。见下面的例子:



新版格式较之老版要紧凑一些,Linux内核源码的升级就是按照新版上下文格式用diff组织的,比如patch-2.4.16中所用的具体命令为:

diff -Nur linux-2.4.15 linux

参数N表示如果某个文件仅在一个目录中出现,则假定其在另一个目录中为空文件;u表示unified格式,r表示在目录中嵌套使用,linux-2.4.15显然是老核的目录名,而linux则为新核的目录名。

2 patch

尽 管并没有指定patch和diff的关系,但通常patch都使用diff的结果来完成打补丁的工作,这和patch本身支持多种diff输出文件格式有 很大关系。patch通过读入patch命令文件(可以从标准输入),对目标文件进行修改。通常先用diff命令比较新老版本,patch命令文件则采用 diff的输出文件,从而保持原版本与新版本一致。

patch的标准格式为


patch [options] [originalfile] [patchfile]

如 果patchfile为空则从 标准输入读取patchfile内容;如果originalfile也为空,则从patchfile(肯定来自标准输入)中读取需要打补丁的文件名。因 此,如果需要修改的是目录,一般都必须在patchfile中记录目录下的各个文件名。绝大多数情况下,patch都用以下这种简单的方式使用:


patch -p[num] <patchfile

patch 命令可以忽略文件中的 冗余信息,从中取出diff的格式以及所需要patch的文件名,文件名按照diff参数中的"源文件"、"目标文件"以及冗余信息中的"Index:" 行中所指定的文件的顺序来决定。也就是说,对于如下diff结果文件(Linux内核源码2.4.16升级包,部分):

 
diff -Nur linux-2.4.15/Makefile linux/Makefile
--- linux-2.4.15/Makefile Thu Nov 22 17:22:58 2001
+++ linux/Makefile Sat Nov 24 16:21:53 2001
@@ -1,7 +1,7 @@
VERSION = 2
PATCHLEVEL = 4
-SUBLEVEL = 15
-EXTRAVERSION =-greased-turkey
+SUBLEVEL = 16
+EXTRAVERSION =

KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
……

patch 首先尝试当前目录(或 者-d参数指定的目录)下的linux-2.4.15/Makefile文件是否存在,如果不存在则试图对linux/Makefile文件操作,仅当两 者都不存在时(或者设置了POSIXLY_CORRECT环境变量)才会读取Index:的内容(此文件中没有标识)。

前 面提到的-p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,-p0(或者-p 0)表示使用全部的路径信息,-p1将忽略第一个"/"以前的目录,依此类推。如/usr/src/linux-2.4.15/Makefile这样的文 件名,在提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。

对于刚才举的 Linux内核源码2.4.16升级包的例子,假定源码目录位于/usr/src/linux中,则在当前目录为/usr/src时使用"patch -p0 <patch-2.4.16"可以工作,在当前目录为/usr/src/linux时,"patch -p1<patch-2.4.16"也可以正常工作。

patch可以直接操作上下文格式以及混合ed格式的diff输出文件,而将ed格式文件通过管道提交给ed程序操作(暂时不知RCS格式的文件如何处理)。


3. 配合使用diff和patch升级源码

在此仅举一个简单的例子来说明如何用diff/patch工具维护源码升级。

假设program-1.0目录中为老版,现开发完成的新版位于program-2.0目录中,将两个目录置于同一父目录下,然后在该父目录上执行:


diff -Nur program-1.0 program-2.0 >program-2.0.patch

将生成一个program-2.0.patch的补丁文件,发布该补丁文件(当然可以先压缩成bzip2格式)。

假设拿到的是program-2.0.patch.bz2文件,则在program-1.0目录同级执行:


bzcat program-2.0.patch.bz2 | patch -p0

如此即完成了从1.0到2.0的升级。

如果希望恢复到原版本,可以使用-R(--reverse)参数,但仅对上下文格式的diff文件有效。还有一个备份参数也可以使用,但简单应用中,整个目录备份可能更方便一些。

================================================================

linux学习杂记_编程风格_diff_patch_svn

两大风格:
GNU编程风格->http://www.gnu.org/prep/standards/ 要点:
函数开头的左花括号在最左边,其他的左括号避免放到最左边;
函数名的起始字符也要在最左边;
每个程序开头都要有一段注释说明其功能;
函数的注释:功能,参数类型,含义,返回值;
while,if尽量带上括号;
避免在if中赋值;
结构的声明和typedef,结构变量定义尽可能不放一起;
全局变量要注释;
全局变量和函数,避免采用简单的名字,小写字母加下划线构成;
局部变量命名要简短;

kernel编程风格-> 要点:
缩进格式是tab,缺省是8字符;
函数长度不应超过2屏(24*2);函数局部变量不应超过10个;
将开始的大括号放在一行的最后,函数定义除外;
结束的大括号通常单独位于一行,下列情况除外:
do {
}while();
if () {
}else if () {
}else{
}


indent工具:
indent -gnu style.c -o style_gnu.c //变成gnu风格
indent -kr -i8 style.c -o style_kernel.c //变成内核风格


diff:
输出格式:nomal格式, -c上下输出格式, -y并排输出格式, -u统一输出格式
diff file1 file2 的输出:
<表示第一个文件file1
>表示第二个文件file2
? file1要如何变成file2呢:
ndm 表示file1的n行删除,后面的部分加到file2的m行后面;
ncm 表示file1的n行改成file2的m行那样;
nam 表示file1的n行后面的部分添加到file2的m行后面;

上下输出格式说明:
- file1需要删除的
! file1需要更改的
+ file1需要添加的

统一输出格式说明:
- file1中需要删除的
+ file1中需要添加的
@@ -n,m +p,q @@
该比较块中,file1从n行开始,共m行,file2从p行开始,共q行;

一些选项:
-q only report whether differ
-b ignore space change,but can detect the difference of no space to have space
-w ignore all spaces
-B ignore blank lines
-r enter subdir to diff

常用的命令格式:
diff -urN dir1 dir2 > dir.patch 产生patch的diff应采用统一格式u选项;

diff3 [option] file_chg1 file_org file_chg2 > newfile
将前后2个文件与当中的原始文件比较,输出结果.
-m选项可以合并文件,对于同一处的不同修改则报告冲突,显示为:<<<<||||====>>>>

patch [options] < patchfile
选项:
-p num 剥离前num个目录进行patch
-d dir 先进入dir目录,再patch
-R 逆向还原
如:
diff -u hello.c lohhe.c > hello.patch
patch -p0 < hello.patch
patch -R -p0 < hello.patch

diff -urN doc1 doc2 > doc.patch
rm doc2 -rf
patch -p0 < doc.patch
or
patch -d doc1 -p1 < doc.patch


subversion
产生背景->lock-modify-unlock机制的弊病:
无法并行开发;如果修改同一文件的不同部分,不需要加锁;如果2人同时修改2个依赖的文件,则不可同步了.
svn采用copy-modify-merge机制
安装:sudo aptitude install subversion
创建respository:
svnadmin create ~/respos
启动网络服务器:
svnserve -d 以daemon的方式启动服务,默认端口3690,不需要root权限

修改配置文件:
vi ~/respos/conf/svnserve.conf
[gerneral]
password-db = passwd 表示用户帐号文件是~/respos/conf/passwd

vi ~/respos/conf/passwd
[users]
harry = harrysecret 注意都要顶格写,行首不空;
marry = marrysecret

导入项目文件:
svn import project_dir
...enter nano, input some description word, ^o save, ^x quit.
password for 'PC_user':
username: 'SVN_user'
password for 'SVN_user':

建立工作站:checkout
svn checkout svn://127.0.0.1/home/PC_user/respos/project_dir local_project_dir
svn commit 提示服务器上的内容有被他人commit过,commit不成功
svn update 从服务器下载最新内容,并与自己的修改合并,若有冲突,会提示,需先解决
svn resolved file 告诉svn冲突已经解决,然后可以commit了
svn commit 发出更新服务器上的内容

svn status 显示本地工作目录的文件状态
svn add file 将file文件,目录,符号连接,加入respository
svn delete file
svn copy file1 file2
svn move file2 file3
svn commit 将修改同步到服务器
svn revert file1 撤销本地修改,恢复到update时候的状态
svn log 显示所有nano信息
svn diff --revision 3:5 比较版本3和5
svn update --revision 3 整个目录退回到版本3
svn help 可显示更多命令信息

From:

blog.csdn.net/digbug/archive/2007/01/16/1484851.aspx

blog.chinaunix.net/u1/53151/showart_418323.html

http://hi.baidu.com/yanyulou/blog/item/675458aff357f6f8fbed50d6.html
diff和patch是一对工具,在数学上来说,diff是对两个集合的差运算,patch是对两个集合的和运算。
diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的patch文件,即补丁文件。
patch能将diff文件运用于 原来的两个集合之一,从而得到另一个集合。举个例子来说文件A和文件B,经过diff之后生成了补丁文件C,那么着个过程相当于 A -B = C ,那么patch的过程就是B+C = A 或A-C =B。
因此我们只要能得到A, B, C三个文件中的任何两个,就能用diff和patch这对工具生成另外一个文件。

这就是diff和patch的妙处。下面分别介绍一下两个工具的用法:

1. diff的用法

diff后面可以接两个文件名或两个目录名。 如果是一个目录名加一个文件名,那么只作用在那么个目录下的同名文件。

如果是两个目录的话,作用于该目录下的所有文件,不递归。如果我们希望递归执行,需要使用-r参数。

命令diff A B > C ,一般A是原始文件,B是修改后的文件,C称为A的补丁文件。
不加任何参数生成的diff文件格式是一种简单的格式,这种格式只标出了不一样的行数和内容。我们需要一种更详细的格式,可以标识出不同之处的上下文环境,这样更有利于提高patch命令的识别能力。这个时候可以用-c开关。


2. patch的用法

patch用于根据原文件和补丁文件生成目标文件。还是拿上个例子来说

patch A C 就能得到B, 这一步叫做对A打上了B的名字为C的补丁。

之一步之后,你的文件A就变成了文件B。如果你打完补丁之后想恢复到A怎么办呢?

patch -R B C 就可以重新还原到A了。

所以不用担心会失去A的问题。

其 实patch在具体使用的时候是不用指定原文件的,因为补丁文件中都已经记载了原文件的路径和名称。patch足够聪明可以认出来。但是有时候会有点小问 题。比如一般对两个目录diff的时候可能已经包含了原目录的名字,但是我们打补丁的时候会进入到目录中再使用patch,着个时候就需要你告诉 patch命令怎么处理补丁文件中的路径。可以利用-pn开关,告诉patch命令忽略的路径分隔符的个数。举例如下:

A文件在 DIR_A下,修改后的B文件在DIR_B下,一般DIR_A和DIR_B在同一级目录。我们为了对整个目录下的所有文件一次性diff,我们一般会到DIR_A和DIR_B的父目录下执行以下命令

diff -rc DIR_A DIR_B > C

这个时候补丁文件C中会记录了原始文件的路径为 DIR_A/A

现在另一个用户得到了A文件和C文件,其中A文件所在的目录也是DIR_A。 一般,他会比较喜欢在DIR_A目录下面进行patch操作,它会执行

patch < C

但是这个时候patch分析C文件中的记录,认为原始文件是./DIR_A/A,但实际上是./A,此时patch会找不到原始文件。为了避免这种情况我们可以使用-p1参数如下

patch -p1 < C

此时,patch会忽略掉第1个”/”之前的内容,认为原始文件是 ./A,这样就正确了。
使用patch

patch附带有一个很好的帮助,其中罗列了很多选项,但是99%的时间只要两个选项就能满足我们的需要:

patch -p1 < [patchfile]

patch -R < [patchfile] (used to undo a patch)

-p1选项代表patchfile中 文件名左边目录的层数,顶层目录在不同的机器上有所不同。要使用这个选项,就要把你的patch放在要被打补丁的目录下,然后在这个目录中运行path -p1 < [patchfile]。
----------------------------------------------------------------------------------------------------------------------
补丁Patch是天才程序员、Perl的发明者Larry Wall发明的,它应高效地交流程序源代码之需求而生,随着以Linux为代表的开发源代码运行的蓬勃发展,patch这个概念已经成为开放源代码发起 者、贡献者和参与者的集体无意识的一部分。patch只包含了对源代码修改的部分,这对于开放源代码社区的协同开发模式具有重要意义,意味的软件新版本的 发布和对软件的缺陷或改进可以以更小的文件发布,可以减少网络的传输量,方便软件维护者的管理工作。

patch文件有多种格式,不同平台上所支持的格式不尽相同,但最常见的是context格式和unified格式。context格式被广泛使用,是 patch文件格式事实上的标准。该格式包含了差异部分及其邻近的若干行,邻近就是所谓的上下文,这些行虽然没有变化,但它们出现在patch文件使得还 原patch的程序具备更强的容错性。unified格式常见于GNU的patch实现,以patch形式发布的linux内核就使用了该格式。此外,还 有其它比较少用的格式,如Normal格式,并排对比模式(side-by-side),ed script和RCS script模式等。除了并排对比模式方便用户观察文件差异,其它格式大多数是为了兼容旧的patch格式。


patch的工具

patch有十分丰富的工具,在Unix/Linux系统下diff/patch是最主要的patch命令行工具。另外,一些版本控制软件 TortoiseCVS、 Subversion, WinMerge及集成开发环境如Eclipse包含了patch生成、应用的功能。使用命令行工具生成在Unix/Linux系统下只需要使用diff 命令,在Windows下可以安装Cygwin来模拟Unix环境,当然有时候Cygwin显得过于庞大,此时可以使用unxutils,它是常用的 GNU命令在Windows系统上的移植版,其中包含了diff和patch命令。从http://unxutils.sourceforge.net下 载该软件包后,将其usr\local\wbin目加到Path环境变量即可使用这些命令。


产生补丁
生成patch命令用diff命令,该命令的基本用法是:
diff [选项] 旧文件或目录 新文件或目录
该命令根据选项产生新旧文件或目录之间的patch,并把该patch输出到标准输出上。
选项用来指定输出的patch文件格式,如果比较的是目录是否需要递归,对只在一边目录中存在的文件的处理方法,如何处理空格、制表符、小写等;常用选项有
-c 表示产生context格式的patch
-u 表示产生unified格式的patch
-r 表示对目录进行递归操作,用于产生整个代码树的patch
-N 表示如果文件不存在则将其等价为空文件,这个用于产生有文件增加或删除的patch

接下来,需要指定比较的对象,它们可以是文件,也可以时目录。旧版本列在前面,新版本列在后面。当然,文件或目录也可以从标准输入获得。此时,文件或目录名称用减号"-"表示。实例:

cat build.xml |diff -y -W 100 - build-1.10.xml
以每列100个字符的宽度并排对比输出build.xml和build-1.10.xml之间的差异到屏幕(标准输出)

diff -c web.xml web2.xml > web.xml.diff
产生web2.xml相对于web.xml的修改的上下文格式补丁文件到web.xml.diff中去

diff -crN src src_XFIRE > xfire-patch.diff
产生代码树src_XIRE相对于代码树src的上下文补丁文件到xfire-patch.diff中去,在src_XFIRE中新增的文件的内容也会被包含在补丁中。




打补丁
打补丁可以使用命令行工具patch。它的基本用法是:patch -pnum < 补丁文件。
打补丁时将工作目录改到需要打补丁源代码顶层目录,然后确定p后面的数字,该数字表示需要去掉的补丁文件中目录的层数,该数字和补丁创建时候工作目录和代 码目录的相对位置有关,一般补丁的作者为在补丁文档中指明。如果没有指定,可以通过观察补丁文件中列出的文件完整路径和代码树中该文件所在相对路径得出。

例子:
cd src
patch -p1 < xfire-patch.diff
==============================================
使用diff/patch为代码打补丁
1.diff的使用
diff可以完成比较功能,生成补丁文件
格式::diff [option] oldfile newfile
常用的option选项有:
-r 对目录进行递归处理
-u 输出统一格式,diff有"传统"和"统一"两种格式,现在一般使用"统一"格式,比较而言,统一格式生成的文件大,但包含了更多的信息,有利于阅读与定位
-N 补丁中包含整个新文件
-a 补丁中包含二进制文件
缺省时,diff向标准输出打印,所以一般都重定向到文件并以patch为后缀,也就是所谓的补丁文件
举例:
/* oldfile hello.c */
void main()
{
printf("hello the world!\n");
}


/* newfile hello-new.c */
void main()
{
printf("HELLO THE WORLD!\n");
}

使用以下命令生成补丁文件hello.patch
$diff -u hello.c hello-new.c >hello.patch


diff可以对整个目录进行比较,生成补丁文件
例如有hello-1.0 和hello-1.1两个目录,其中hello-1.1为hello-1.0的更新
命令:
$diff -ruNa hello-1.0 hello-1.1 >hello-1.1.patch


2.patch的使用
把补丁运用到原代码上的命令为patch
patch [-b] suffix <patchfile

如果patch失败,patch会把成功的行打上补丁,失败的行存为以.rej为后缀的文件折,并生成原文件的备份,如果成功则不生成备份。 -b选项可以指定后缀名。
注意:运行patch所在的目录应该与用diff生成补丁的时候一致。例如,上面在hello-1.0目录的上层目录生成补丁文件,patch时也应该在此目录进行。
============================================

diff && path- -

diff
diff是生成源码补丁的必备工具。其命令格式为:

 diff [命令行选项] 原始文件 新文件

常用命令行选项如下:

   -r 递归处理目录     -u 输出统一格式(unified format)

   -N patch里包含新文件   -a patch里可以包含二进制文件

  它的输出在stdout上,所以你可能需要把它重定向到一个文件。diff的输出有“传统格式”和“统一格式”之分,现在大都使用统一格式:

  传统格式示例:

   [hahalee@builder]$ diff a.txt b.txt

   1a2

   > here we insert a new line

   3d3

   < why not this third line?

  统一格式示例:

   [hahalee@builder]$ diff -u a.txt b.txt

   --- a.txt Thu Apr 6 15:58:34 2000

   +++ b.txt Thu Apr 6 15:57:53 2000

   @@ -1,3 +1,3 @@

   This is line one

   +here we insert a new line

   and this is line two

   -why not this third line?

   通过比较可以看出,传统格式的patch文件比较小,除了要删除/插入的行外没有冗余信息。统一格式则保存了上下文(缺省是上下各三行,最少需要两 行),这样,patch的时候可以允许行号不精确匹配的情况出现。另外,在patch文件的开头明确地用---和+++标示出原始文件和当前文件,也方便 阅读。要选用统一格式,用 u 开关。

通常,我们需要对整个软件包做修改,并生成一个patch文件,下面是典型的操作过程。这里就要用到前面介绍的几个命令行开关了:

  tar xzvf software.tar.gz # 展开原始软件包,其目录为software

  cp _a software software-orig # 做个修改前的备份

  cd software

  [修改,测试……]

  cd ..

  diff _ruNa software-orig software > software-my.patch

   现在我们就可以保存software-my.patch做为这次修改的结果,至于原始软件包,可以不必保存。等到下次需要再修改的时候,可以用 patch命令把这个补丁打进原始包,再继续工作。比如是在linux kernel 上做的工作,就不必每次保存几十兆修改后的源码了。这是好处之一,好处之二是维护方便,由于unified patch格式有一定的模糊匹配能力,能减少原软件包升级带来的维护工作量(见后)


patch

  patch命令跟diff配合使用,把生成的补丁应用到现有代码上。常用命令行选项:

  patch [命令行选项] [待patch的文件[patch]]

  -pn patch level(n是数字) -b[后缀] 生成备份,缺省是.orig

为了说明什么是patch level,这里看一个patch文件的头标记。

  diff -ruNa xc.orig/config/cf/Imake.cf xc.bsd/config/cf/Imake.cf

  --- xc.orig/config/cf/Imake.cf Fri Jul 30 12:45:47 1999

  +++ xc.new/config/cf/Imake.cf Fri Jan 21 13:48:44 2000

   这个patch如果直接应用,它会去找xc.orig/config/cf目录下的Imake.cf文件,假如你的源码树的根目录是缺省的xc而不是 xc.orig,除了mv xc xc.orig之外,有无简单的方法应用此patch呢?patch level就是为此而设:patch会把目标路径名砍去开头patch level个节(由/分开的部分)。在本例中,可以用下述命令:cd xc; patch _p1 < /pathname/xxx.patch 完成操作。注意,由于没有指定patch文件,patch程序默认从stdin读入,所以用了输入重定向。

  如果patch成功,缺省是不建备份文件的(注:FreeBSD下的patch工具缺省是保存备份),如果你需要,可以加上 b 开关。这样把修改前的文件以“原文件名.orig”的名字做备份。如果你喜欢其它后缀名,也可以用“b 后缀”来指定。

  如果patch失败,patch会把成功的patch行给patch上,同时(无条件)生成备份文件和一个.rej文件。.rej文件里是没有成功提交的patch行,需要手工patch上去。这种情况在原码升级的时候有可能会发生。

  关于二进制文件的说明:binary文件可以原始方式存入patch文件。diff可以生成(加-a选项),patch也可以识别。如果觉得这样的patch文件太难看,解决方法之一是用uuencode处理该binary文件。

rcs

  单个文件的版本控制/管理,适合对少量文件进行版本控制,不适合小组进行项目协作开发。优点:使用简便;缺点:功能有限。RCS常用命令有ci/co/rcsdiff。
rcs用一个后缀为“,v”的文件保存一文件的内容和所有修改的历史信息,你可以随时取出任意一个版本,用rcs保存程序就不必为不同版本分别备份。
ci _ check in,保存新版本
co _ check out,取出当前(或任意)版本

cvs 是多平台的,开发可以在多种平台比如,可以把linux上的CVS Repository通过samba export出来在Windows平台上做开发。现在很多软件包里包含有*NIX/Windows/MacOS等多平台支持代码,cvs的跨平台特性可提 供最好的多平台开发支持。

  不过,cvs的操作是直接基于文件系统的,在需要大量远程协作的场合问题很多,远程的NFS mount效率太差,也会有安全问题。新版本的cvs自身内建了Client/Server支持,也可以利用Unix上传统的远程交互手段来通讯。

  1,通过rsh(也可用ssh替换)

  2,使用cvs自带的C/S用户认证:pserver(缺省端口2401)

  3,使用kerberos的gserver、kserver


# 可以把库文件拷贝到 /etc/ld.so.conf 中列举出的任何目录中,并以
root 身份运行 ldconfig;或者
# 运行 export LD_LIBRARY_PATH='pwd',它把当前路径加到库搜索路径中去。
1> ldd 工具
ldd 用来显示执行文件需要哪些共享库, 共享库装载管理器在哪里找到了需要的共享库.

2> soname

共 享库的一个非常重要的,也是非常难的概念是 soname--简写共享目标名(short for shared object name)。这是一个为共享库(.so)文件而内嵌在控制数据中的名字。如前面提到的,每一个程序都有一个需要使用的库的清单。这个清单的内容是一系列库 的 soname,如同 ldd 显示的那样,共享库装载器必须找到这个清单。

soname 的关键功能是它提供了兼容性的标准。当要升级系统中的一个库时,并且新库的 soname 和老的库的 soname 一样,用旧库连接生成的程序,使用新的库依然能正常运行。这个特性使得在 Linux 下,升级使用共享库的程序和定位错误变得十分容易。

在 Linux 中,应用程序通过使用 soname,来指定所希望库的版本。库作者也可以通过保留或者改变 soname 来声明,哪些版本是相互兼容的,这使得程序员摆脱了共享库版本冲突问题的困扰。

查看/usr/local/lib 目录,分析 MiniGUI 的共享库文件之间的关系

3> 共享库装载器

当 程序被调用的时候,Linux 共享库装载器(也被称为动态连接器)也自动被调用。它的作用是保证程序所需要的所有适当版本的库都被调入内存。共享库装载器名字是 ld.so 或者是 ld-linux.so,这取决于 Linux libc 的版本,它必须使用一点外部交互,才能完成自己的工作。然而它接受在环境变量和配置文件中的配置信息。

文件 /etc/ld.so.conf 定义了标准系统库的路径。共享库装载器把它作为搜索路径。为了改变这个设置,必须以 root 身份运行 ldconfig 工具。这将更新 /etc/ls.so.cache 文件,这个文件其实是装载器内部使用的文件之一。

对软件的评价:代码的稳定性、友好性、代码的易读性、统一的风格、技巧。

1。尽量少的使用全局变量

2。局部变量一定要初始化,特别是指针变量

3。成员函数功能单一,不要过分追求技巧,函数体不要过长。

4。最好有头文件

5。关于变量名的长短问题

6。设计函数时考虑到通用性

7。申请内存时,一定先要释放。注意 if 问题。

8。对浮点数比较大小时注意不要使用 ==

9。最好不要用 goto 语句

10。所有成员函数要单出口单入口

11。函数中,要先检验参数的合法性

12。最好所有的函数都有返回值,表明错误的原因。

13。注释问题

14。类型转化一律用显示转换。

15。定义宏说,参数使用括号,结果也应该括起来

#define SUB(a,b) ((a)-(b))

3*SUB(3,4-5);

16。变量长度一定要用 sizeof 来求

17。malloc 后千万别忘 free 及使指针等于 NULL。

18。字符串拷贝时尽量少使用 sprintf,而使用 memcpy,最后别忘加上'\0'

19。慎重选择编译时的优化选项。

20。小组开发时,注意代码风格的统一。


对目录进行操作
生成补丁命令

diff -urN 文件原始目录 文件开发目录 > 补丁文件

打补丁

patch -s -d 文件原始目录 < 补丁文件

恢复

patch -s -R -d 文件原始目录 < 补丁文件
分享到:
评论

相关推荐

    JIDE Diff(对比) 开发员技术手册

    除了传统的Java IDE或源代码版本控制系统的diff工具是必要的,在金融应用,如开发应用,计算机,网络管理也需要diff工具来比较文本文件,邮件,XML文件等。 杰笛对比引进了包括比较(diff)和合并(merge)一起的...

    vscode-diff-merge:一个vscode扩展来合并差异

    在资源管理器面板或编辑器选项卡上右键单击文件[1] 单击[Diff & Merge] Select file to compare 右键单击另一个文件或编辑器选项卡 单击[Diff & Merge] Compare file with selected file 2.差异和合并-针对剪贴板...

    Linux安全设置实践.

    案例3:使用diff和patch工具打补丁 案例4:iptables基本管理 案例5:filter过滤和转发控制 案例6:防火墙扩展规则 案例7:配置SNAT实现共享上网 案例8:常用系统监控命令配置与使用Zabbix监控系统

    关于发布程序上线和回滚的shell

    把你修改到的patch文件 到 PATCH_ROOT 目录中 文件结构目录和正式环境保持一致 3. 上线工作: diff -r -b 比较 备份环境 和 发布环境 文件差异; 再次确定修改是否正确 PATCH_ROOT 下的文件夹和文件 发布到正式...

    Code Blocks

     Code::Blocks具有灵活而强大的配置功能,除支持自身的工程文件、C/C++文件外,还支持AngelScript、批处理、CSS文件、D语言文件、Diff/Patch文件、Fortan77文件、GameMonkey脚本文件、Hitachi汇编文件、Lua文件、...

    Code::Blocks 8.02 GCC 4.40 汉化包

     Code::Blocks具有灵活而强大的配置功能,除支持自身的工程文件、C/C++文件外,还支持AngelScript、批处理、CSS文件、D语言文件、Diff/Patch文件、Fortan77文件、GameMonkey脚本文件、 Hitachi汇编文件、Lua文件、...

    regutils:regutils-Perl中Unix C和INI文件工具中的Win9x注册表工具-开源

    Regutils是程序的集合,以帮助管理Windows软件和系统的配置。 该实用程序可用于在用户登录或引导计算机时动态地应用特定于用户和计算机的自定义项。 它们还可以用于识别和纠正软件配置之间的相似性和差异。 这些在...

    Linux指令一周通 (技术图书大系).azw3

    文件格式为azw3,文字版本,可以用kindle阅读,PC端可以用calibre,可以转成epub所有手机阅读软件都支持,对手机的排版支持还不错. 内容目录 第1天 文本操作指令 1.1 ar 指令:创建、修改或从档案文件中提取文件 1.2 ...

    patchmanager

    补丁管理者 Patchmanager是可用于修改Sailfish OS用户体验的工具。 它基于AUSMT(自动更新系统修改技术),这是一组启用系统文件修补的脚本。 Patchmanager的启动器... 它必须命名为unified_diff.patch 。 通常,您可

    Linux命令大全

    linux命令大全,中文版本 Linux命令大全(修改版) 进行重新编译的说明 文件传输 bye ftp ftpcount ftpshut ftpwho ncftp tftp uucico uucp uupick uuto 备份压缩 ar bunzip2 bzip2 bzip2recover compress cpio dump ...

    Linux命令大全(CHM格式离线版)

    文件管理 diff diffstat file find git gitview ln locate lsattr mattrib mc mcopy mdel mdir mktemp mmove mread mren mshowfat mtools mtoolstest mv od paste patch rcp rhmask rm slocate split tee tmpwatch ...

    pf-merge:非营利组织的特殊管理工具

    pf-merge 该项目为非营利组织提供了一个非常具体的管理工具。 快速而肮脏的软件解决方案只对目标 NPO 有益。 GUI基于Swing,Apache POI用于访问MS文档,Neil Fraser的Diff-match-patch库用于字符串匹配。

    Linux命令搜索工具linux-command.zip

    diff、diffstat、file、find、git、gitview、ln、locate、lsattr、mattrib、mc、mcopy、mdel、mdir、mktemp、mmove、mread、mren、mshowfat、mtools、mtoolstest、mv、od、paste、patch、rcp、rhmask、rm、slocate...

    linux全部命令列表,Linux 命令大全

    1、文件管理 cat chattr chgrp chmod chown cksum cmp diff diffstat file find git gitview indent cut ln less locate lsattr mattrib mc mdel mdir mktemp more mmove mread mren mtools ...

    Linux命令大全完整版

    5.linux文件管理命令 85 diff(differential) 85 diffstat(differential status) 86 file 87 find 87 git(gnu interactive tools) 90 gitview(gnu interactie tools viewer) 91 ln(link) 91 locate 92 lsattr...

Global site tag (gtag.js) - Google Analytics