当前位置: 首页 > news >正文

C语言应用层程序热补丁

一、热补丁简介

一个正在运行的程序,要是有某函数或某流程有问题,需要修改,有两个方式:

1.通过设置LD_PRELOAD把需要的库重新定向,但这种方式需要重启正在运行的程序。
2.通过修改可执行文件某个函数指向的地址,指向新的函数,这种方式可不重启正在运行的程序。这就热补丁(hotpatch)。

二、热补丁使用

1.API介绍

Linux提供了一套API来动态装载库。热补丁主要使用如下API:
- dlopen,打开一个库,并为使用该库作些准备。
- dlsym,在打开的库中查找符号的值。
- dlclose,关闭库。

在使用一下API时,要提前包含头文件**#include <dlfcn.h>**

dlopen函数原型:
void *dlopen(const char *filename, int flags);--filename是你要打开的库路径--flags必须有RTLD_LAZY或者RTLD_NOW其中之一。RTLD_LAZY:在dlopen返回前,对于动态库中的未定义的符号不执行解析。(仅针对函数,变量立即解析)RTLD_NOW:需要在dlopen返回前,解析出所有未定义符号,如果解析不出来,在则会返回NULL和错误。***/*可以和一下参数进行搭配使用*/***--RTLD_GLOBAL:动态库中定义的符号可被其后打开的其它库解析。--RTLD_LOCAL:与RTLD_GLOBAL作用相反,动态库中定义的符号不能被其后打开的其它库重定位。如果没有指明是RTLD_GLOBAL还是RTLD_LOCAL,则缺省为RTLD_LOCAL。--RTLD_NODELETE:dlclose()期间不卸载库,并且在以后使用dlopen()重新加载库时不初始化库中的静态变量。--RTLD_NOLOAD:不加载库。可用于测试库是否已加载(dlopen()返回NULL说明未加载,否则说明已加载),也可用于改变已加载库的flag。--RTLD_DEEPBIND:在搜索全局符号前先搜索库内的符号,避免同名符号的冲突。
返回值是句柄,在下面dlsym中使用。
dlsym函数原型
void *dlsym(void *handle, const char *symbol);--handle是dlopen返回的句柄。--symbol是你想替换的符号。
返回值是指向替换后函数的地址,供调用使用。
dlclose函数原型
int dlclose(void *handle);
注意用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0,才会真正被系统卸载。

三、热补丁代码示例

要被替换的函数
该文件起名为1.c,要先编为1.so。

gcc -fPIC -shared 1.c -o 1.so
#include <stdio.h>int func2()
{printf("1.c_func2\n");return 0;
}int func1()
{func2();printf("1.c_func1\n");return 0;
}

需要替换的
该文件起名为2.c,编译的时候要加上 -ldl。

gcc 2.c -ldl
#include <stdio.h>
#include <dlfcn.h>
#include <stdlib.h>int func2()
{printf("2.c_func2\n");return 0;
}int func1()
{func2();printf("2.c_func1\n");return 0;
}int main()
{void * handle;/*定义一个函数指针指向原函数,这样就可以在后面一直使用原函数名了*/int  (*func)(void);func = func1;/*获得句柄*/handle = dlopen("./1.so", RTLD_LAZY);/*原函数*/func();sleep(1);func();sleep(1);/*进行函数替换*/*(void **)(&func)=dlsym(handle,"func1");/*这个时候在打印就已经变了*/func();dlclose(handle);return 0;
}

该程序输出

2.c_func2
2.c_func1
2.c_func2
2.c_func1
1.c_func2
1.c_func1

四、热补丁补充

1.根据上面代码,可以看出如果函数中包含别的函数,也是可以替换的。但是如果只有声明没有实现就会段错误。
2.不同进程的是不能替换的,就算是函数指针定义在最前面也不可以。
3.再编译的时候不能去符号,不要不能替换。

五、热补丁其他方法

1.找个空地址把新函数烧进去,然后修改原函数的入口地址。这个方法普遍使用于单片机上。
2.C语言调用lua脚本,通过lua脚本进行源代码的替换。这个办法需要业务程序也是lua语言写的。

如果大家还有别的办法,也请评论区给我说一下。

相关文章:

C语言应用层程序热补丁

一、热补丁简介 一个正在运行的程序&#xff0c;要是有某函数或某流程有问题&#xff0c;需要修改&#xff0c;有两个方式&#xff1a; 1.通过设置LD_PRELOAD把需要的库重新定向&#xff0c;但这种方式需要重启正在运行的程序。 2.通过修改可执行文件某个函数指向的地址&…...

【代码随想录+力扣hot100】双指针

文章目录 27. 移除元素思路&#xff1a;代码&#xff1a; 26. 删除有序数组中的重复项代码&#xff1a;思路一&#xff1a;重复元素必相邻思路二&#xff1a;从第一个位置开始考虑快慢指针 977.有序数组的平方思路&#xff1a;代码&#xff1a; 283. 移动零代码&#xff1a;思路…...

【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(三):性能优化策略

关于MySQL部分的核心知识进行一网打尽,包括三部分:基础知识考察、核心机制策略、性能优化策略,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第三部分:性能优化策略,子节点表示追问或同级提问 读写分离 分布式数据库的…...

qnx 上screen + egl + opengles 最简实例

文章目录 前言一、qnx 上的窗口系统——screen二、screen + egl + opengles 最简实例1.使用 addvariant 命令创建工程目录2. 添加源码文件3. common.mk 文件4. 编译与执行总结参考资料前言 本文主要介绍如何在QNX 系统上使用egl和opengles 控制GPU渲染一个三角形并显示到屏幕上…...

python基础学习-02

基本的程序设计模式 任何的程序设计都包含IPO&#xff0c;它们分别代表如下&#xff1a; I&#xff1a;Input 输入&#xff0c;程序的输入 P&#xff1a;Process 处理&#xff0c;程序的主要逻辑过程 O&#xff1a;Output 输出&#xff0c;程序的输出 因此如果想要通过计算…...

服务调用Ribbon,LoadBalance,Feign

服务调用Ribbon、Fegin Ribbon实现负载均衡的原理 1&#xff1a;LoadBalancerAutoConfiguration这个类&#xff0c;这个类主要做的就是把LoadBalancer拦截器封装到RestTemplte拦截器集合里面去。 2&#xff1a;然后在代码里面调用restTemplate.getForObject或者其他方法的时候&…...

一条sql是如何运行的

在我们平时使用sql的时候&#xff0c;基本是基于黑盒的使用方式&#xff0c;在客户端输入一条sql语句&#xff0c;然后回显想要的数据&#xff0c;对于mysql server端内部如何运行的以及与存储引擎如何交互的不得而知。 通过下面一幅图&#xff0c;大致描述客户端和服务端交互…...

SystemC学习笔记(三) - 查看模块的波形

简述 波形在Simulation/Emulation中地位十分重要&#xff0c;尤其是在研发初期&#xff0c;只能通过波形来查看软件hang住的位置。 对于TLM来说&#xff0c;查看波形一般是指查看pvbus上的transaction&#xff0c;而对于SystemC本身来说&#xff0c;查看波形就是使用Gtkwave或…...

计算机网络(第六版)复习提纲5

SS2.2 有关信道的几个基本概念 2.通信模型 三个主要部分&#xff1a;信源、信道、信宿 3.通信方式: a)术语&#xff1a;消息&#xff08;传递的内容&#xff09;、数据&#xff08;传递的形式&#xff09;、信号&#xff08;数据表现形式&#xff0c;有模拟信号和数字信号两种&…...

JavaScript 学习笔记(WEB APIs Day3)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…...

Springboot自动装配:三个注解、Selector、spring.factories文件、@ConditionalOnProperty注解

借鉴&#xff1a; 这个链接是包含run方法进来debug看整个过程的&#xff0c;建议先看&#xff1a;https://www.cnblogs.com/starsray/p/15580915.html https://blog.csdn.net/fengxiandada/article/details/130080828 Springboot自动装配 1.创建springboot应用 如何创建一个s…...

软件工程应用题汇总

绘制数据流图(L0/L1/L2) DFD/L0&#xff08;基本系统模型&#xff09; 只包含源点终点和一个处理(XXX系统) DFD/L1&#xff08;功能级数据流图&#xff09;在L0基础上进一步划分处理(XXX系统) 个人理解 DFD/L2&#xff08;在L1基础上进一步分解后的数据流图&#xff09; 数据…...

P1789 【Mc生存】插火把(C语言)

首先&#xff0c;我们可以先用数组来储存地图&#xff08;建议用int&#xff0c;我试过bool会RE&#xff09; 每次读入火把和萤石的坐标 接着把能照亮的地方标记起来 最后用计数器统计会生成怪的地方有钻石的话还怕怪吗 最后&#xff0c;上代码 #include<stdio.h> i…...

计算机网络(第六版)复习提纲6

SS2.3 导引型传输媒体 1.三类位非导引型传输媒体 a)双绞线&#xff1a;两根铜线平行会相互干扰&#xff0c;垂直干扰最小&#xff0c;双绞线近似垂直&#xff0c;绞合度越高&#xff0c;可用的数据传输率越高。 i.无屏蔽双绞线UTP&#xff08;便宜&#xff09; ii.屏蔽双绞线&a…...

安卓平板局域网内远程控制工控机方法

安卓平板局域网内远程控制工控机方法 将所需要远程控制的工控机通过网线连接到具有WiFi功能的路由器上&#xff0c;将安卓平板连接上WiFi&#xff0c;如下图所示 下载NoMachine远程软件安装包&#xff0c;官网地址&#xff1a;https://www.nomachine.com/ 点击Download now按钮…...

pinctrl子系统简介

一. 简介 上一章我们编写了基于设备树的 LED 驱动&#xff0c;但是驱动的本质还是没变&#xff0c;都是配置 LED 灯所使用的 GPIO 寄存器&#xff0c;驱动开发方式和裸机基本没啥区别。 Linux 是一个庞大而完善的系统&#xff0c; 尤其是驱动框架&#xff0c;像 GPIO …...

基于51单片机的温度报警控制系统Protues仿真设计

目录 一、设计背景 二、实现功能 三、总体硬件设计 四、仿真演示 四、源程序 一、设计背景 随着现代工农业技术的发展及人们对生活环境要求的提高&#xff0c;人们也迫切需要检测与了解环境温度。特别地&#xff0c;高温情况下极易造成火灾&#xff0c;例如&#xff0c;在…...

多级缓存

一、多级缓存 传统的缓存策略一般是请求到达Tomcat后&#xff0c;先查询Redis&#xff0c;如果未命中则查询数据库&#xff0c;如图&#xff1a; 存在下面的问题&#xff1a; •请求要经过Tomcat处理&#xff0c;Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时&#xff…...

【已解决】如何用typedef简化函数指针

博文内容简短&#xff0c;主要介绍typedef简化函数指针&#xff0c;形式是typedef int(*pp)(int,int);并用一个加法的例子去演示&#xff0c;如何用typedef简化函数指针。 示例 #include<stdio.h> int add(int a,int b) {return a b; } typedef int(*p)(int, int); in…...

UI网站汇总

Material Design的九大设计原则 Material Design的学习笔记 Material Design复杂响应式设计 MaterialPalette MD风格调色板 Iconfont Clipartlogo Dribbble https://dribbble.com/search?qapp Uplabs 优设 站酷 我图网 思维网 欢迎补充&#xff01;&#xff01;...

PLC-IoT 网关开发札记(5):将本地数据库作为资产打包发布到 App

App需求&#xff1a;保存物模型 什么是物模型 在项目开发中&#xff0c;用到了本地数据库&#xff0c;这个本地数据库记录了系统的物模型。所谓物模型就是对某一个设备的可操纵属性的定义&#xff0c;每一个设备包括了一个或者多个属性&#xff0c;通过获取这些属性的当前值可…...

固态硬盘优化设置

目录 前言&#xff1a; 关闭Windows Search 禁用系统保护&#xff08;不建议&#xff09; 不建议禁用系统保护原因 关闭碎片整理【机械硬盘】 提升固态硬盘速度 开启TRIM 合理使用固态硬盘的容量 正确关机 关闭开机自启 前言&#xff1a; 电脑配备固态硬盘就能一劳…...

SpringBoot跨域问题解决

前端访问后台接口时&#xff0c;浏览器报错&#xff0c;跨域无法访问。 报错信息如下&#xff1a; Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the requested resource. 经过一番百度之后&#…...

FindMy技术与相机结合

FindMy是苹果公司提供的设备追踪服务&#xff0c;用来帮助用户定位丢失的设备。自苹果公司开放Findmy网络之后&#xff0c;FindMy技术便与各种生活设备相结合&#xff0c;比如与相机的结合。 想象一下&#xff0c;你正在外出办事或者旅行时&#xff0c;突然意识到相机丢了&…...

Windows WSL2 占用磁盘空间清理释放

目前工作中时常用到WSL2&#xff08;Ubuntu20.04&#xff09;&#xff0c;在使用一段时间后会发现WSL2所占用磁盘空间越来越多&#xff0c;体现在WSL2之上安装Linux分发对应的vhdx虚拟磁盘文件体积越来越大&#xff0c;会占用Windows自身空间&#xff0c;即使手动清理了Linux分…...

2022 年全国职业院校技能大赛高职组云计算赛项试卷部分解析

2022 年全国职业院校技能大赛高职组云计算赛项试卷部分解析 【赛程名称】高职组-云计算赛项第一场-私有云【任务 1】私有云服务搭建[10 分]【题目 2】Yum 源配置[0.5 分]【题目 3】配置无秘钥 ssh[0.5 分]【题目 4】基础安装[0.5 分]【题目 5】数据库安装与调优[0.5 分]【题目 …...

2.C语言——控制语句

控制语句 1.分支语句/判断语句if 语句if...else 语句if...else if...else语句 switch语句 2.循环语句 while 语句 do...while 语句 for 语句 3.转向语句 break continue go to 1.分支语句/判断语句 if 语句 if(boolean_expression) { /* 如果布尔表达式为真将执行的语句 */ } …...

Linux网络之PXE高效批量装机、Kickstart全自动化安装

一. PXE网络装机简介和相关知识 1. 常见的三种系统安装方式和相关文件 ① 三种系统安装方式 u启动安装&#xff1a;在U盘中下载相关的安装系统及镜像文件&#xff0c;u盘插机安装 光驱安装&#xff1a;将带有所需系统的光盘放进电脑服务器中&#xff0c;按照官方引导装机 …...

react umi/max 页签(react-activation)

思路&#xff1a;通过react-activation实现页面缓存&#xff0c;通过umi-plugin-keep-alive将react-activation注入umi框架&#xff0c;封装页签组件最后通过路由的wrappers属性引入页面。 浏览本博客之前先看一下我的博客实现的功能是否满足需求&#xff0c;实现功能&#xf…...

计算机网络编程

一、计算机网络&#xff08;概述、简介&#xff09; 说起网络&#xff0c;相信大家都不陌生&#xff0c;把分散在不同地点的计算机设备&#xff0c;通过传输介质、通信设施和网络通信协议&#xff0c;实现资源共享和信息传输的系统&#xff0c;我们称之为&#xff1a;计算机网…...