unix系统里是怎么加载新版本的动态连接库到内存?
假如有一个动态连接库libyso.so,定义了一个函数func(),返回值100,函数体如下:
int func(){
return 100;
}
另有一个可执行程序是ytst,每隔1秒钟printf一次动态库中函数func()的值和函数的地址。如:
void main(int argc,char **argv){
printf("nfunc addr=%0X return=%d n",func,func());
}
然后打开一个shell,执行ytst,开始输出func的地址和返回值,一秒钟一行的输出下去。。
func addr=BFFF0AD0 return=100
func addr=BFFF0AD0 return=100
func addr=BFFF0AD0 return=100
func addr=BFFF0AD0 return=100
再另开一个shell,更改函数func()的返回值为50,重新编译连接。(需要 rm libyso.so ,rm ytst)
然后再执行一次ytst,这时也输出了func的地址和返回值,一秒钟一行的输出下去。
func addr=BFFF0AD0 return=50
func addr=BFFF0AD0 return=50
func addr=BFFF0AD0 return=50
func addr=BFFF0AD0 return=50
对比两边的输出,可以发现func的地址是相同的,但返回值一个是100,一个是50。
为什么会这样?
如果一个动态连接库文件被加载到内存后,硬盘上的这个动态链接库文件又重新编译了成最新的,这时再被一个进程加载到内存。那么第二个版本的动态链接库是怎么被加载的,是覆盖第一个?
从上面的输出情况来看,因为func函数的地址是一样的,所有应该是覆盖了老版本。可为什么第一个进程返回值的没有变成50呢?
[ 本帖最后由 yuaiyong 于 2006-9-20 15:35 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论