答案1
给文件打补丁意味着修改它,其含义是修改通常很小。该用法来自一般英语用法,其中补丁是一个小的修改(例如,对一块布)。对于文件来说,补丁并不总是修复。
补丁是描述如何修改一个文件或一组文件的一系列指令。在 Unix 世界中,补丁通常是diff
命令,描述文本文件中的更改。这种意义上的补丁描述了在文件中添加、删除或修改行的修改。该patch
实用程序应用这些指令来修改一个文件或一组文件。它尝试智能地将多个补丁应用到同一个文件,因为第一个补丁可能会导致阻止应用第二个补丁的更改,因为文件不再处于预期状态。因为它们的操作强烈基于行,diff
所以patch
它们不太适合二进制文件。
xxd
是用于处理二进制文件的通用实用程序。它的功能之一是对文件进行修改。例如,该命令xxd -r - xxd.1
意味着应用标准输入上描述的修改。示例补丁(即修改指令)0000037: 3574 68
的意思是:从偏移量0x37
(即十进制的 55)开始,将接下来的三个字节替换为 0x35、0x74 和 0x68(即三个字符5th
)。
答案2
当您将补丁应用于文件时,您将使用更新的数据覆盖其中的一部分(补丁还可以在末尾添加附加数据)。您可以修补任何类型的文件,无论是文本、二进制还是其他类型的文件,因为所有文件归根结底都是字节流。
补丁文件中指定了应该被覆盖的部分。
如果软件修复涉及更新文件,则补丁可以将该文件修改为与更新文件的完整版本相同。由于补丁不是完整文件,而只是差异,因此补丁会更小,消耗更少的磁盘空间,下载时消耗更少的带宽。
在十六进制编辑器(例如hexer
)中直接编辑二进制文件有时称为“手动”修补。
我不熟悉xxd
,但从初步搜索看来xxd
可以生成倾倒或二进制数据的十六进制列表,并且还可以将此类列表转换回直接二进制。因此,您可以使用 转储十六进制xxd
,使用vim
或其他文本编辑器对其进行编辑,然后使用xxd -r
.您还可以使用“hexdump 格式”echo
通过管道将字符串传递给它。 xxd
(其他选项可让您对二进制文件执行更改。看起来xxd
有很多选项可让您指定开始和停止覆盖或修补的位置。)
示例中的第一个命令基本上是告诉将文件中从偏移量开始的xxd
字节更改为(ASCII 表示“第 5”)。 可以读取它自己的“hexdump”格式,这就是“echo”命令提供给.xxd.1
0x0000037
0x35 0x74 0x68
xxd
xxd
示例中的第二个命令是转储-c
文件中从同一偏移量开始的 13 个字节的计数 ( )。
该patch
命令执行类似的操作,但它需要“diff”格式的文件。您可以通过保存命令的输出来创建 diff 文件diff
,该文件将比较两个文件并以所述 diff 格式表达差异。从阅读man
页面来看,补丁更多的是用于更改文本文件,而不是直接的二进制文件。
答案3
在微控制器上,有时会有程序改变程序存储器,即程序本身。你可以说程序在运行时“变异”。
这只是更改二进制应用程序的一种解释。
事实上,您在微控制器程序中经常使用二进制修补。由于您的程序是机器代码,并且通常是在汇编程序中进行编程,因此汇编后的机器代码非常直接地表示了您所编程的内容。因此,一旦您的代码被组装,您只需为部分或全部微控制器程序存储器提供补丁即可。