紧急求助:如何在应用程序运行的时候给程序打补丁?

长山互联网未来探索 2010-07-14 09:07:28
环境:Linux AS5.0
开发语言:c/c++

需求:在应用程序运行的时候,希望能够不停止应用程序,而对应用程序打补丁,从而改变应用程序的行为。
印象当中VxWorks系统是可以的,但是Linux下查了一天,没有找到。diff和patch是对源代码打补丁的,实现不了这个功能。

那位高手用过,指点一下。谢谢!!!


...全文
532 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
x86 2010-07-19
  • 打赏
  • 举报
回复
所谓软件,包含几个部分:
1、二进制的执行代码,不包括动态库,也就是执行文件。执行后就装载到内存中,无法改变。
2、动态库,也就是.so文件,通过dlopen装载。这些文件可以动态替换,不过如果程序已经装载了该so文件,则必须通知(比如发信号)程序重新装载。
3、资源文件。如果程序已经打开,正在使用,则需要通知程序重新打开。否则直接替换即可。

如果补丁是针对源码的,你可以编译后,根据上面的原则替换对应文件,不过要保证编译参数跟运行中的版本一致。

另外,给进程发SIGCOUT信号也可以重启进程,不过进程同时也被打断了。
  • 打赏
  • 举报
回复
我知道华为是可以的。

但不知道是怎么实现的
leo_dengzx 2010-07-14
  • 打赏
  • 举报
回复
我觉得难度还是很大的,但肯定是要使用动态库。
steptodream 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 pottichu 的回复:]

引用 14 楼 steptodream 的回复:

GNU的软件可以直接在VxWorks里用吗

不能, Vxworks 是一套 完全不同的体系, “应用程序”和内核驱动等是一体的。
说是应用程序,还不如说是内核的一个模块。
[/Quote]
太高深了
我在想 要是所有的系统 所有的软件都能很容易做成楼主说的那样
以后系统 软件升级打补丁 再也不用重启系统或者服务 那多好啊
pottichu 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 steptodream 的回复:]

GNU的软件可以直接在VxWorks里用吗
[/Quote]
不能, Vxworks 是一套 完全不同的体系, “应用程序”和内核驱动等是一体的。
说是应用程序,还不如说是内核的一个模块。
pottichu 2010-07-14
  • 打赏
  • 举报
回复
你可以看看这个。
http://www.dzjs.net/html/qianrushixitong/2007/0320/1770.html
steptodream 2010-07-14
  • 打赏
  • 举报
回复
GNU的软件可以直接在VxWorks里用吗
steptodream 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pottichu 的回复:]

引用 2 楼 steptodream 的回复:

开发我不太会 但是我感觉这个可不可以 跟你程序自身的关系最大

印象当中VxWorks系统是可以的
------------------
你的印象是什么样的?


VxWorks 确实可以做到在线更新, 以前看到过这方面的文章,没有去实践。呵呵。
[/Quote]
我是想知道是什么样的效果
pottichu 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 steptodream 的回复:]

开发我不太会 但是我感觉这个可不可以 跟你程序自身的关系最大

印象当中VxWorks系统是可以的
------------------
你的印象是什么样的?
[/Quote]

VxWorks 确实可以做到在线更新, 以前看到过这方面的文章,没有去实践。呵呵。
pottichu 2010-07-14
  • 打赏
  • 举报
回复
用 dlopen, dlclose. 是可以实现动态加载和卸载动态库的。

但是动态更新模块对程序的设计要求比较高,简单点说就是要动态库提供的接口尽量简单,功能尽量独立,
当模块被卸载的时候, 主程序要能缓存 需要 被卸载模块去处理的数据。
pengsixiang 2010-07-14
  • 打赏
  • 举报
回复
Coder_Granger提到的通过SIGINT信号,这个信号是通知程序重新加载so还是通知程序重新初始化呢?如果是程序重新初始化的话,可能还是无法实现楼主的要求,因为程序的存储空间及地址都被重新分配了,已有的数据也就没有意义了。跟重启程序似乎没有区别了,那使用so的作用不就没有表现出来了。
qiyu1988 2010-07-14
  • 打赏
  • 举报
回复
程序sleep下再调用?
Coder_Granger 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pengsixiang 的回复:]

引用 6 楼 cceczjxy 的回复:

引用 4 楼 hittlle 的回复:

我有一个思路, 就是利用动态库;补丁什么的,就是替换动态库,然后重新加载就行;比如,如查程序中用到libabc.so, 我替换掉libabc.so之后, 向程序发一个信息,告诉它有库更新了;它可以重新载入这个.要不用用dlopen?


可以,不过,要补充一点,你需要先释放掉动态库的函数后,才能替……
[/Quote]

一般通过SIGINT信号
pengsixiang 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cceczjxy 的回复:]

引用 4 楼 hittlle 的回复:

我有一个思路, 就是利用动态库;补丁什么的,就是替换动态库,然后重新加载就行;比如,如查程序中用到libabc.so, 我替换掉libabc.so之后, 向程序发一个信息,告诉它有库更新了;它可以重新载入这个.要不用用dlopen?


可以,不过,要补充一点,你需要先释放掉动态库的函数后,才能替换动态库
[/Quote]
要怎么通知一个程序释放掉他加载的动态库的函数呢?有什么方法吗?
cceczjxy 2010-07-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hittlle 的回复:]

我有一个思路, 就是利用动态库;补丁什么的,就是替换动态库,然后重新加载就行;比如,如查程序中用到libabc.so, 我替换掉libabc.so之后, 向程序发一个信息,告诉它有库更新了;它可以重新载入这个.要不用用dlopen?
[/Quote]

可以,不过,要补充一点,你需要先释放掉动态库的函数后,才能替换动态库
pengsixiang 2010-07-14
  • 打赏
  • 举报
回复
动态库的加载也是在程序启动时就加载的,而不是在使用到函数的时候才去加载的,所以怕也无法实现楼主的要求的。
hittlle 2010-07-14
  • 打赏
  • 举报
回复
我有一个思路, 就是利用动态库;补丁什么的,就是替换动态库,然后重新加载就行;比如,如查程序中用到libabc.so, 我替换掉libabc.so之后, 向程序发一个信息,告诉它有库更新了;它可以重新载入这个.要不用用dlopen?
pengsixiang 2010-07-14
  • 打赏
  • 举报
回复
对原代码打完补丁后,编译链接,然后重启应用程序就可以了。如果需要热替换,似乎还没有见到过。
steptodream 2010-07-14
  • 打赏
  • 举报
回复
开发我不太会 但是我感觉这个可不可以 跟你程序自身的关系最大

印象当中VxWorks系统是可以的
------------------
你的印象是什么样的?
Coder_Granger 2010-07-14
  • 打赏
  • 举报
回复
这需要应用程序自身的支持
加载更多回复(2)

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧