linux 对文件打补丁(Patch)

文本文件打补丁(Patch):

补丁文件本质上是一个差异文件 (diff),记录了两个版本之间的不同之处。通常使用 diff 命令生成,用 patch 命令应用。

生成补丁

复制代码
# 比较两个文件
diff -u oldfile.c newfile.c > fix.patch

# 比较两个目录(递归)
diff -urN old_dir/ new_dir/ > big_fix.patch
  • -u:生成统一格式(unified diff),最常用;
  • -r:递归比较子目录;
  • -N:把缺失的文件视为空文件,便于新增/删除文件的处理。

应用补丁

文件级补丁

复制代码
# 应用补丁到当前目录的文件
patch < fix.patch

# 或指定目标文件
patch original_file.c < fix.patch

目录级补丁,如内核补丁

复制代码
cd linux-source/
patch -p1 < ../my_kernel_fix.patch

关键参数 -p1

补丁文件中路径可能包含前缀(如 a/kernel/sched.cb/kernel/sched.c)。
-p1 表示忽略第一层目录(即去掉 a/b/),直接在当前目录下找 kernel/sched.c
-p0 表示不剥离任何路径(使用完整路径)。

选项 说明
-pN 剥离 N 层路径前缀
--dry-run 试运行,不实际修改文件,用于测试是否能成功应用
-f--force 强制应用,跳过交互
-R 反向应用(撤销补丁)

diffpatch 的设计原理

  • diff 比较的是文本行(line-based),逐行分析内容差异;
  • 它输出的是"哪些行被添加、删除或修改了";
  • patch 则根据这些"行级指令"去修改目标文件。

二进制文件没有"行"的概念 ,其内容是字节流,任意一个字节变化都可能破坏整个文件结构。因此,传统的 unified diff(即 .patch 文件)无法描述二进制差异。

二进制文件打补丁

使用 bsdiff / bspatch

这是专门为二进制文件设计的差分/打补丁工具。

  • bsdiff:生成两个二进制文件之间的最小差异补丁;

  • bspatch:用该补丁将旧文件升级为新文件。

    生成补丁(耗时可能较长)

    bsdiff old_app.bin new_app.bin update.bspatch

    应用补丁(很快)

    bspatch old_app.bin updated_app.bin update.bspatch

    验证是否一致

    cmp new_app.bin updated_app.bin # 应无输出(完全相同)

cmp 比较两个文件

  • 作用 :以字节为单位(byte-by-byte)比较两个文件;
  • 默认行为
    • 如果两个文件完全相同 → 不输出任何内容,返回退出状态码 0
    • 如果存在差异 → 输出第一个不同字节的位置和值 ,并返回非零状态码(通常是 1)。
选项 说明
-s, --quiet, --silent 静默模式:不输出任何信息,仅通过退出码判断是否相同(非常适合脚本)
-l, --verbose 列出所有不同字节的位置和值(以十进制字节偏移 + 八进制值显示)
-n N 最多比较前 N 个字节
-i SKIP 跳过每个文件开头的 SKIP 字节再比较

静默比较(脚本中最常用)

复制代码
if cmp -s new_app.bin updated_app.bin; then
    echo "文件一致!"
else
    echo "文件不同!"
fi
相关推荐
树℡独3 小时前
ns-3仿真之应用层(五)
服务器·网络·tcp/ip·ns3
小小管写大大码3 小时前
如何让vscode变得更智能?vscode接入claude实现自动编程
运维·ide·vscode·自动化·编辑器·ai编程·腾讯云ai代码助手
嵩山小老虎3 小时前
Windows 10/11 安装 WSL2 并配置 VSCode 开发环境(C 语言 / Linux API 适用)
linux·windows·vscode
Fleshy数模4 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
zhang133830890754 小时前
CG-09H 超声波风速风向传感器 加热型 ABS材质 重量轻 没有机械部件
大数据·运维·网络·人工智能·自动化
a41324474 小时前
ubuntu 25 安装vllm
linux·服务器·ubuntu·vllm
Configure-Handler4 小时前
buildroot System configuration
java·服务器·数据库
津津有味道4 小时前
易语言TCP服务端接收刷卡数据并向客户端读卡器发送指令
服务器·网络协议·tcp·易语言
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.5 小时前
Keepalived VIP迁移邮件告警配置指南
运维·服务器·笔记
物联网软硬件开发-轨物科技5 小时前
【轨物洞见】告别“被动维修”!预测性运维如何重塑老旧电站的资产价值?
运维·人工智能