免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jeanlove
打印 上一主题 下一主题

[讨论一下!]我发现动态库并不是只存在一份内存拷贝 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-09-28 14:41 |只看该作者
原帖由 deadlylight 于 2008-9-28 14:40 发表



没有听说过这个说法
动态库的符号地址存在.got.plt,是由loader填进去的,不是绝对地址,所以不存在逻辑地址不一样的问题


.got.plt是每个进程有一份吗? 如果是,那么又如何保证所有进程的.got.plt的逻辑地址是一样的?

[ 本帖最后由 ytl 于 2008-9-28 14:43 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
12 [报告]
发表于 2008-09-28 14:43 |只看该作者
原帖由 jeanlove 于 2008-9-28 14:39 发表
如果代码只有一份,它怎么去访问多份数据呢?

它只访问一份数据。

动态库的代码段也好,数据段也好,都会映射到使用它的进程的地址空间中。

论坛徽章:
0
13 [报告]
发表于 2008-09-28 14:43 |只看该作者
原帖由 ytl 于 2008-9-28 14:35 发表


跟导出没关系,不导出也是靠逻辑地址访问的

你man mmap,然后了解一下指定MAP_PRIVATE 参数时的行为,就可以知道为什么你不可能在linux下面通过动态库共享内存

论坛徽章:
0
14 [报告]
发表于 2008-09-28 14:45 |只看该作者
原帖由 jeanlove 于 2008-9-28 14:39 发表
如果代码只有一份,它怎么去访问多份数据呢? 想不通。。。。。。

楼上说的导出全局变量给程序用的情况,不能说是一个错误,因为我在很多大型系统中都见到过这种情况(银行,电信计费等等),这种情况很普遍啊! ...

这绝对是个错误的做法,进程间共享内存不应该通过动态库做,除非是个只读变量。

论坛徽章:
0
15 [报告]
发表于 2008-09-28 14:47 |只看该作者
原帖由 zx_wing 于 2008-9-28 14:43 发表

你man mmap,然后了解一下指定MAP_PRIVATE 参数时的行为,就可以知道为什么你不可能在linux下面通过动态库共享内存


这个我知道。说到底就是数据有多分的原因。
但是代码如果有一份,那么怎么用不同的逻辑地址访问不同进程的数据实例,不理解怎么实现

论坛徽章:
0
16 [报告]
发表于 2008-09-28 14:48 |只看该作者
原帖由 zx_wing 于 2008-9-28 14:45 发表

这绝对是个错误的做法,进程间共享内存不应该通过动态库做,除非是个只读变量。


没人说通过动态库做进程间共享内存

论坛徽章:
0
17 [报告]
发表于 2008-09-28 14:48 |只看该作者
原帖由 deadlylight 于 2008-9-28 14:40 发表



没有听说过这个说法
动态库的符号地址存在.got.plt,是由loader填进去的,不是绝对地址,所以不存在逻辑地址不一样的问题

没听过什么说法?
这个和加载没有关系,而是当进程试图写动态库数据段时,此时由于是私有映射而导致一个COW,所以每个进程维护了一份属于自己的动态库数据段

论坛徽章:
0
18 [报告]
发表于 2008-09-28 14:51 |只看该作者
原帖由 ytl 于 2008-9-28 14:47 发表


这个我知道。说到底就是数据有多分的原因。
但是代码如果有一份,那么怎么用不同的逻辑地址访问不同进程的数据实例,不理解怎么实现

代码只有一份,但它映射到各个进程的地址空间中。那当某个进程调用动态库的函数时,由于处于当前进程的地址空间,动态库中的函数使用虚拟地址访问到的就是该进程的数据

论坛徽章:
0
19 [报告]
发表于 2008-09-28 14:53 |只看该作者
原帖由 ytl 于 2008-9-28 14:48 发表


没人说通过动态库做进程间共享内存

楼主想看到的结果不外乎是这个static变量被加了两次,既然不同的进程看到的是一份全局变量,就是共享内存。

论坛徽章:
0
20 [报告]
发表于 2008-09-28 14:55 |只看该作者
原帖由 zx_wing 于 2008-9-28 14:51 发表

代码只有一份,但它映射到各个进程的地址空间中。那当某个进程调用动态库的函数时,由于处于当前进程的地址空间,动态库中的函数使用虚拟地址访问到的就是该进程的数据


终于接近一点了。
但是每个进程的虚拟地址是不同的,而代码是相同的,怎么处理?前面有人说.got.plt,但是.got.plt同样有虚拟地址问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP