57 KVM工具使用指南-制作 LibcarePlus 热补丁

2023-11-18

57 KVM工具使用指南-制作 LibcarePlus 热补丁

57.1 概述

LibcarePlus 支持如下方式制作热补丁:

  • 手动制作
  • 通过脚本制作

手动制作热补丁的过程繁琐,对于代码量较大的工程,例如QEMU,手动制作热补丁极其困难。建议使用 LibcarePlus 自带脚本一键式地生成热补丁文件。

57.2 手动制作

本节以原文件 foo.c 和补丁文件 bar.c 为例,给出手动制作热补丁的指导。

  1. 准备 C 语言编写的原文件和补丁文件。例如原文件 foo.c 和补丁文件 bar.c 。

    点击展开 foo.c

    点击展开 bar.c

  2. 编译得到原文件和补丁文件的汇编文件 foo.sbar.s,参考命令如下:

    # gcc -S foo.c
    # gcc -S bar.c
    # ls
    bar.c  bar.s  foo.c  foo.s
    
  3. 使用 kpatch_gensrc 对比 foo.s 和 bar.s 差异,生成包含原文件的汇编内容和差异内容的 foobar.s,参考命令如下:

    # sed -i 's/bar.c/foo.c/' bar.s
    # kpatch_gensrc --os=rhel6 -i foo.s -i bar.s -o foobar.s --force-global
    

    由于 kpatch_gensrc 默认对同一 C 语言原文件进行对比,所以对比前需要使用 sed 命令将补丁汇编文件 bar.s 中的 bar.c 改为原文件名称 foo.c。随后调用 kpatch_gensrc,指定输入文件为 foo.s 与 bar.s,输出文件为 foobar.s。

  4. 编译原文件的汇编文件 foo.s 和生成的汇编文件 foobar.s,得到可执行文件 foo 和 foobar,参考命令如下:

    # gcc -o foo foo.s
    # gcc -o foobar foobar.s -Wl,-q
    

    链接选项 -Wl, -q 将保留foobar中的重定位节。

  5. 利用 kpatch_strip 去除可执行程序 foo 和 foobar 的相同内容,保留制作热补丁所需要的内容。

    # kpatch_strip --strip foobar foobar.stripped
    # kpatch_strip --rel-fixup foo foobar.stripped
    # strip --strip-unneeded foobar.stripped
    # kpatch_strip --undo-link foo foobar.stripped
    

    上述命令中的各参数含义为:

    • –strip 用于去除 foobar 中对于补丁制作无用的 section;
    • –rel-fixup 用于修复补丁内所访问的变量以及函数的地址;
    • strip –strip-unneeded 用于去除对于热补丁重定位操作无用的符号信息;
    • –undo-link 用于将补丁内符号的地址从绝对地址更改为相对地址。
  6. 制作热补丁文件。

    通过以上操作,已经得到了热补丁制作所需的主要内容。接下来需要使用 kpatch_make 将原可执行文件的 Build ID 以及 kpatch_strip 的输出文件 foobar.stripped 作为参数传递给 kpatch_make,最终生成热补丁文件,参考命令如下:

    # str=$(readelf -n foo | grep 'Build ID')
    # substr=${str##* }
    # kpatch_make -b $substr -i 0001 foobar.stripped -o foo.kpatch
    # ls
    bar.c  bar.s  foo  foobar  foobar.s  foobar.stripped  foo.c  foo.kpatch  foo.s
    

    至此,就得到了patch ID为0001的热补丁文件 foo.kpatch。

57.3 通过脚本制作

本节介绍如何利用 LibcarePlus 自带的 libcare-patch-make 脚本制作热补丁文件,仍以原文件 foo.c 和补丁文件 bar.c 为例。

  1. 利用 diff 命令生成 foo.c 和 bar.c 的对比文件,命令如下所示:

    # diff -up foo.c bar.c > foo.patch
    

    foo.patch 文件内容如下所示:

    点击展开 foo.patch

  2. 编写编译 foo.c 的 Makefile 文件,具体如下所示:

    点击展开 Makefile

  3. 编写好 Makefile 之后,直接调用 libcare-patch-make 即可。若 libcare-patch-make 询问选择哪个文件进行打补丁操作,输入原文件名即可,具体如下所示:

    # libcare-patch-make --clean -i 0001 foo.patch
    rm -f foo
    BUILDING ORIGINAL CODE
    /usr/local/bin/libcare-cc -o foo foo.c
    INSTALLING ORIGINAL OBJECTS INTO /libcareplus/test/lpmake
    mkdir $DESTDIR || :
    cp foo $DESTDIR
    applying foo.patch...
    can't find file to patch at input line 3
    Perhaps you used the wrong -p or --strip option?
    The text leading up to this was:
    --------------------------
    |--- foo.c	2020-12-10 09:43:04.445375845 +0800
    |+++ bar.c	2020-12-10 09:48:36.778379648 +0800
    --------------------------
    File to patch: foo.c         
    patching file foo.c
    BUILDING PATCHED CODE
    /usr/local/bin/libcare-cc -o foo foo.c
    INSTALLING PATCHED OBJECTS INTO /libcareplus/test/.lpmaketmp/patched
    mkdir $DESTDIR || :
    cp foo $DESTDIR
    MAKING PATCHES
    Fixing up relocation printf@@GLIBC_2.2.5+fffffffffffffffc
    Fixing up relocation print_hello+0
    patch for /libcareplus/test/lpmake/foo is in /libcareplus/test/patchroot/700297b7bc56a11e1d5a6fb564c2a5bc5b282082.kpatch
    

    执行成功之后,输出显示:热补丁文件位于当前目录的 patchroot 目录下,可执行文件则在 lpmake 目录下。脚本生成的热补丁文件默认是采用 Build ID 作为热补丁文件的文件名。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

57 KVM工具使用指南-制作 LibcarePlus 热补丁 的相关文章

  • 刷题day_9 : 删除链表的倒数第 N 个结点

    题意描述 给你一个链表 删除链表的倒数第 n 个结点 并且返回链表的头结点 利用虚拟头结点 和双指针法 如果要删除倒数第n个节点 让fast移动n步 然后让fast和slow同时移动 直到fast指向链表末尾 删掉slow所指向的节点就可以
  • MoCaPose:在宽松服装中实现动作捕捉

    动作姿态是人类个体活动和互动的基本信息来源 采集人们的动作信息能实现了解 分析日常生活等功能 尽管在宽松服装上可以使用IMU实现动作捕捉 但由于需要将大量IMU并将其节点牢固 精确地固定在特定的身体位置 因此并不适合许多现实生活中的应用 这

随机推荐

  • python cgi如何获得html post 的信息,如何在Python CGI脚本中读取所有HTTP标头?

    可以使用python在apache CGI脚本中获取自定义请求标头的值 解决方法与此类似 Apache的mod cgi将为收到的每个HTTP请求标头设置环境变量 以这种方式设置的变量都将带有HTTP 前缀 因此例如x client vers
  • pluto实现分析(10)

    本文档的Copyleft归yfydz所有 使用GPL发布 可以自由拷贝 转载 转载时请保持文档的完整性 严禁用于任何商业用途 msn yfydz no1 hotmail com 来源 http yfydz cublog cn 10 主机对
  • 信息网络传播权 服务器,信息网络传播权的特征

    信息网络传播权的特征 著作权法法律快车2018 05 1510 21 062415人阅读15赞 不论是专业人士 还是普通民众 对 广播权 和 信息网络传播权 的感知总是通过日常频繁接触广播电台 电视台 网站等传播媒介得以实现的 那么信息网络
  • pytorch低版本环境加载高版本(1.6+)模型报错(xxx is a zip archive (did you mean to use torch.jit.load()?))

    问题描述 transformers 4 0 版本训练出来的模型 在3 0的Model from pretrained中加载会报错 pytorch model bin is a zip archive did you mean to use
  • 最近读的AIGC相关论文思路解读

    AIGC之SD可控生成论文阅读记录 提示 本博客是作者本人最近对AIGC领域相关论文调研后 临时记录所用 所有观点都是来自作者本人局限理解 以及个人思考 不代表对 如果你也正好看过相关文章 发现作者的想法和思路有问题 欢迎评论区留言指正 既
  • renren-fast-vue 无法启动成功原因

    renren fast vue 无法启动主要是因为node版本过高 需要使用8x版本 并且安装node sass node版本 https blog csdn net weixin 42713970 article details 8650
  • python实现全排列_python实现全排列代码(回溯、深度优先搜索)

    从n个不同元素中任取m m n 个元素 按照一定的顺序排列起来 叫做从n个不同元素中取出m个元素的一个排列 当m n时所有的排列情况叫全排列 公式 全排列数f n n 定义0 1 1 递归实现全排列 回溯思想 1 1 思想 举个例子 比如你
  • X-admin框架中change事件失效如何实现省市区三级联动

    Uncaught TypeError layui form is not a function的错误 我现在使用的就是X admin1 1版本的后台模板 在实现了三级联动的情况下想套上去结果发现会报上面的错误等等 在html中select标
  • 通俗易懂,带你了解应用面向对象(含例子超简单)

    面向对象的一些基本概念 软件工程第六版 下面都是面向对象的精华 好好吸收 完全可以掌握 拿一个圆做例子 有半径 周长 颜色 位置 我们现在有3个不同的圆 每个圆就是一个不同的的对象 但是他们都有相同的数据 半径 周长 和相同的操作 显示自己
  • ORA-00381: cannot use both new and old parameters for buffer cache size specification

    原创文章 转载请注明出处 作者 Lilge链接 http liglexiner itpub net post 43018 517486 修改了上次的undo tablespace的问题后 工作人员反映说 可以不调一下数据库 感觉查询很慢 于
  • 绑定域名,搭建私人网站

    前言 互联网上充斥着大大小小的网站 你是不是有时候也想拥有一个自己的网站 这其实并不难 你只需要满足这些条件即可 1 一台服务器 所谓的服务器可以简单理解为一台24小时不关机的电脑 并且这台服务器要有一个独立ip 本质上我们的个人电脑都可以
  • 微信小程序中如何获取用户手机号授权登录

    随着微信小程序的普及 许多应用程序需要用户登录才能提供更好的服务 而获取用户手机号码是验证用户身份和确保账户安全的重要步骤之一 因此 在本文中 我们将介绍如何在微信小程序中实现手机号授权登录 步骤一 在小程序后台添加手机号授权 首先 在小程
  • 安装配置nfs服务

    NFS的功能 让不同操作系统之间可以互传文件 Server端 Server端可以关闭防火墙 或放行nfs服务 systemctl stop firewalld 临时关闭防火墙 systemctl disable firewalld 开机自动
  • Spring Boot中yml文件和properties文件的区别?

    Spring Boot中application properties和application yml 1 在properties文件中是以 进行分割的 在yml中是用 进行分割 2 yml文件拥有天然的树状图 看得更舒服 3 yml是支持中
  • protobuf-2.6.1下载和安装

    下载地址 https github com protocolbuffers protobuf archive refs tags v2 6 1 zip autogen sh configure make make check sudo ma
  • 使用wireshark观察SSL/TLS握手过程--双向认证/单向认证

    SSL TLS握手过程可以分成两种类型 1 SSL TLS 双向认证 就是双方都会互相认证 也就是两者之间将会交换证书 2 SSL TLS 单向认证 客户端会认证服务器端身份 而服务器端不会去对客户端身份进行验证 我们知道 握手过程实际上就
  • Linux面试题

    文章目录 Linux 概述 什么是Linux Unix和Linux有什么区别 什么是 Linux 内核 Linux的基本组件是什么 Linux 的体系结构 BASH和DOS之间的基本区别是什么 Linux 开机启动过程 Linux系统缺省的
  • 存储器3-DDR SDRAM双倍速率同步动态存储器

    1 信号电平 采用STTL 2电平 2 5V 标准 VIH AC Vref 0 31 VIH DC Vref 0 15 VIL DC Vref 0 15 VIL AC Vref 0 31 高于VIH AC 为高 纹波只要不低于VIL DC
  • Angular_项目完善搜索功能(表单处理)

    在商品名称和商品价格以及商品类别都输入或者选择合法的情况下才能进行搜索 一 product service ts添加一个新的方法 获取所有商品类别 getAllCategories string return 电子产品 硬件设备 其他 二
  • 57 KVM工具使用指南-制作 LibcarePlus 热补丁

    文章目录 57 KVM工具使用指南 制作 LibcarePlus 热补丁 57 1 概述 57 2 手动制作 57 3 通过脚本制作 57 KVM工具使用指南 制作 LibcarePlus 热补丁 57 1 概述 LibcarePlus 支