【问题标题】:how to compute differences between two binaries (i.e., two executables) in linux如何在linux中计算两个二进制文件(即两个可执行文件)之间的差异
【发布时间】:2012-11-16 10:55:04
【问题描述】:

在 Linux 中有什么方法可以计算两个二进制文件(即两个可执行文件)之间的差异?

让我更具体一点:我想知道如何计算 Linux 中两个版本的可执行文件或应用程序或软件之间的差异(差异差异)。例如,如果我必须仅下载和安装现有应用程序或二进制文件的更新部分(最新版本和旧版本之间的差异差异),我该如何在 Linux 中执行此操作。

【问题讨论】:

  • 最简单的方法可能是比较源代码,如果您可以使用的话。
  • 嗨,Basile,我无法比较源代码,唯一可用的东西是二进制文件的两个版本,一个是最新版本,另一个是旧版本。
  • 但是你能用二进制可执行文件比较的结果做什么呢?那你为什么真的问???
  • @BasileStarynkevitch 您可以使用它来安装更新作为补丁,而不是整个二进制文件,这样您就可以拥有更小的更新。他在他的问题中提到了这一点,我在回答中也提到了这一点。混乱在哪里?

标签: c linux unix embedded-linux


【解决方案1】:

您可以使用工具bsdiff,以及它的配套bspatch,对二进制文件进行有效的差异和补丁。

如果您想获得更小的补丁,可以查看来自 Google Chrome 的Courgette。它建立在 bsdiff 之上,但它们通过在执行 diff 之前实际反汇编它们来提供更有效的可执行文件 diff。它没有作为一个单独的项目分发,但您可以从Chromium source repository 获得它(如何check out the code)。

还有xdelta 工具,它比bsdiff 存在的时间更长。根据 bsdiff 的作者的说法,它的效率要低得多。补丁出来更大。它的优点是它支持标准的 VCDIFF 格式 (RFC 3284),其他几个工具也支持该格式,因此如果您需要使用此类其他工具,它会更有用。

【讨论】:

  • 一个警告:OP 提到嵌入式系统(在标签中),bsdiff 主页说“bsdiff 非常需要内存”——我从来没有想过。
  • @loreb 内存不足的部分是“差异”部分,您可以在其中生成增量(通常在开发或构建机器上)。补丁部分有更合理的内存需求。
  • 请注意,Google 的 Courgette 是 Red Bend 专利诉讼的对象。在bugzilla.mozilla.org/show_bug.cgi?id=504624 有一个简短的讨论和几个链接。
  • @JoshKelley Yuck。是的,看起来 Red Bend 未能获得针对谷歌的初步禁令,但谷歌未能让专利无效,所以斗争仍在继续。总而言之,使用 bsdiff 可能更安全、更简单,它是 Colin Percival 的原创作品,代码不到 500 行,据我所知,没有任何侵权索赔。
  • 首先我很抱歉延迟回复,感谢大家的深刻见解,以及@BrianCampbell 和 Josh Kelley,感谢您提及 Red Bend 和 Google 的故事,我必须与 bsdiff 核对& bspatch。
【解决方案2】:

diff 会告诉你二进制文件是否不同:

diff bin1 bin2
Binary files bin1 and bin2 differ

如果您想要区别,请使用cmp

cmp -l bin1 bin2 
  25  20 320
  26   4   3
  41 270 160
 209   4 264
 210   7   6

-l 选项打印字节数和差异:

-l  --verbose
      Output byte numbers and values of all differing bytes.

【讨论】:

    【解决方案3】:

    尝试cksum - 表明它们是相同的

    【讨论】:

      【解决方案4】:

      你可以使用diff:

      diff old_file new_file
      

      您也可以使用md5,但您必须比较结果。如果 md5 校验和可用,它也可以用于检查下载文件的总和。

      【讨论】:

      • 这只是报告“它们是不同的”,没有并排的差异。
      猜你喜欢
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 2023-04-04
      • 2012-04-01
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多