unix系统里是怎么加载新版本的动态连接库到内存?

发布于 2022-07-17 11:31:36 字数 1170 浏览 7 评论 0

假如有一个动态连接库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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文