当前位置: 技术问答>linux和unix
.so文件被程序加载后,不停止程序,可否更新.so文件?
来源: 互联网 发布时间:2016-03-07
本文导语: 问题如标题 1、我自己编写了一个.so文件,然后写了一个程序调用它 2、假如一些原因,我需要更改.so文件,也就是我重新编译一个.so文件 覆盖掉原先那个.so文件,但是,在这个过程中,我的程序并没有停止, 一直...
问题如标题
1、我自己编写了一个.so文件,然后写了一个程序调用它
2、假如一些原因,我需要更改.so文件,也就是我重新编译一个.so文件
覆盖掉原先那个.so文件,但是,在这个过程中,我的程序并没有停止,
一直在运行。
3、上面的要求可否实现?
注:其实,我已经试验过,不可实现,在第二步时,我用root权限用新的.so文件
覆盖旧的.so文件时,有个提示--"是否覆盖",我选择 y ,然后正在运行的程序退出了,
提示“segment fault”。
我的理解是:原先.so文件加载内存中的地址,因为被新的.so文件覆盖的问题,地址变化,
导致正在运行的文件不能够在内存中找到该.so文件,导致程序崩溃。
各位朋友有什么看法?
最好能够给个方法实现我上面说的要求。
小弟先谢谢各位了
1、我自己编写了一个.so文件,然后写了一个程序调用它
2、假如一些原因,我需要更改.so文件,也就是我重新编译一个.so文件
覆盖掉原先那个.so文件,但是,在这个过程中,我的程序并没有停止,
一直在运行。
3、上面的要求可否实现?
注:其实,我已经试验过,不可实现,在第二步时,我用root权限用新的.so文件
覆盖旧的.so文件时,有个提示--"是否覆盖",我选择 y ,然后正在运行的程序退出了,
提示“segment fault”。
我的理解是:原先.so文件加载内存中的地址,因为被新的.so文件覆盖的问题,地址变化,
导致正在运行的文件不能够在内存中找到该.so文件,导致程序崩溃。
各位朋友有什么看法?
最好能够给个方法实现我上面说的要求。
小弟先谢谢各位了
|
不知道你的动态是不是理解的有问题。
动态应该是指在你的程序执行到要调用.so文件的时候才去找这个函数,愚见。
在你加载.so的程序的时候,写个线程监视看有没有要更新.so的信号,当你要更新.so的时候,发个信号。停止调用,dlclose.然后覆盖.so.再dlopen so
动态应该是指在你的程序执行到要调用.so文件的时候才去找这个函数,愚见。
在你加载.so的程序的时候,写个线程监视看有没有要更新.so的信号,当你要更新.so的时候,发个信号。停止调用,dlclose.然后覆盖.so.再dlopen so
|
在你调用so文件的程序里写个接口先不用这个so,然后更新..
|
听你的描述好像是是在编译的时候就指定了so文件吧?
其实so文件还有一种加载方法,就是用 dlopen,dlclose。这样就可以停止调用某.so文件。
其实so文件还有一种加载方法,就是用 dlopen,dlclose。这样就可以停止调用某.so文件。
|
一般的SO直接覆盖的时候不会提示运行中的.
这种可以发个信号给主程序,让主程序重启就完成了动态加载SO.
这种可以发个信号给主程序,让主程序重启就完成了动态加载SO.
|
嗯,这是个可行的办法。