免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2661 | 回复: 10
打印 上一主题 下一主题

dll 或so的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-06 18:42 |只看该作者 |倒序浏览
关于dll或so的一点疑问:

dll,so他们在计算机内部只有一份copy,而当process在第一次装载的时候才会将他们装到内存中,然后process将地址空间mapping到dll转载的内存地址区间,其他process在装载的时候如果发现在内存中已经有了这个dll,会将内核计数器加1,然后直接mapping到dll的地址空间。(当然这只是对代码段有效,而对于数据段的实现使用copy而非mapping.),在这种情况下操作系统如何判断装载的dll是否在内存中呢?通过dll名称吗?还是dll的导出接口声明呢?所以对于以下情况是否会有问题呢?

1.有两个process,都需要用到common.dll,在各个process目录下都有common.dll文件,他们只是内部的实现逻辑有区别,而在导出接口上是一致的,当process 1转载了一个common.dll后,process 2是否会装载另外一个内部逻辑有区别common.dll,而是直接用process 1装载的dll?

[ 本帖最后由 xiaofei104 于 2005-11-6 18:46 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2005-11-06 18:56 |只看该作者
windows下的东西?如果各自的目录下有自己的.dll的话,会使用自己的而非共享。

以后少来问windows下的东西

论坛徽章:
0
3 [报告]
发表于 2005-11-06 19:00 |只看该作者
我觉得就是文件名称

另外我觉得楼主也没说一定是windows系统啊。

论坛徽章:
0
4 [报告]
发表于 2005-11-06 19:03 |只看该作者
原帖由 zalem 于 2005-11-6 18:56 发表
windows下的东西?如果各自的目录下有自己的.dll的话,会使用自己的而非共享。

以后少来问windows下的东西


首先这个问题并不是windows下的,对于Linux,Unix下share object也是一样会存在这个问题。我只是列出了一个例子而已。

1。应该不是使用各自目录下的,如果是这样的话,相同的dll 或 so,在内存中可能会存在多份copy,这样就有失去dll或so的目的了。

论坛徽章:
0
5 [报告]
发表于 2005-11-06 19:05 |只看该作者
原帖由 sakulagi 于 2005-11-6 19:00 发表
我觉得就是文件名称

另外我觉得楼主也没说一定是windows系统啊。



如果仅仅是文件名称,我想操作系统可能会大难了?如果这样的话,dll,so的名称就不可能相同拉?^_^。

论坛徽章:
0
6 [报告]
发表于 2005-11-06 19:22 |只看该作者
如果是so的话,光名称就有3个,此外与此独立,具体使用哪个,由“编译时参数(soname,rpath)”,“环境变量”,“默认查找路径”三个决定。所以说基本上你说的情况是不存在的。

论坛徽章:
0
7 [报告]
发表于 2005-11-06 19:36 |只看该作者
原帖由 zalem 于 2005-11-6 19:22 发表
如果是so的话,光名称就有3个,此外与此独立,具体使用哪个,由“编译时参数(soname,rpath)”,“环境变量”,“默认查找路径”三个决定。所以说基本上你说的情况是不存在的。


因为dll,so是可复用组件对象模型下的产物,他不可能在每一次load的时候都去从物理文件装载到内存中,对于在内存中如果还没有装载的,你的说法当然是没有错的,关键是有其他进程在load一个内存中已经存在的dll.so的时候,os是怎么去判断我需要转载的dll,so在内存中已经存在,而不需要按照你所说的三个地方重新从文件系统装载。

论坛徽章:
0
8 [报告]
发表于 2005-11-06 19:50 |只看该作者
可能是我没有看懂你的问题,一个程序的所有导入信息,已经在文件内详细记录,如何判断共享库已装载(可能)有两种实现,绝对路径,唯一ID。

如果想详细了解有两种途径,linker&loader,abi。

一起学习,惭愧。

论坛徽章:
1
水瓶座
日期:2014-03-20 18:21:14
9 [报告]
发表于 2005-11-06 19:51 |只看该作者
Unix有比较完善的lib库管理系统,库文件都统一注册放在统一的路径中,程序运行的时候通过环境变量获得库路径,这有先后次序的,先找到的先用
你说的那种情况,如果执行程序都没有强制指定库文件路径的话,那么就调用先找到的那个,那么2个程序应该找到的都是同一个文件,如果那个文件已经在内存中的话就不会再调文件
当然正常情况下,在Unix系统中系统本身管理工具会进行库文件的统一管理,不会出现混乱情况。所以说win下面的所谓dll文件被应用程序覆盖引起系统不稳定这类问题在Unix上基本不会出现。因为Unix使用固定的目录树结构,库文件有固定的地方存放,不会存放在可执行程序的目录中(就算放在里面也不会被调用,因为环境变量里没有./)

论坛徽章:
0
10 [报告]
发表于 2005-11-06 20:00 |只看该作者
原帖由 ecloud 于 2005-11-6 19:51 发表
Unix有比较完善的lib库管理系统,库文件都统一注册放在统一的路径中,程序运行的时候通过环境变量获得库路径,这有先后次序的,先找到的先用
你说的那种情况,如果执行程序都没有强制指定库文件路径的话,那么就 ...


1。先谢谢你的分析,在unix下对于库文件有统一的路径,在windows下一样有统一的路进呀(%SYSTEM%WIN32),如果按照你的意思是不是意味着dll,so在操作系统中是按照它们的名称来判断是否在内存中已经装载了呢?

2。我这里讨论的肯定不是正常情况下,而是非正常情况,而且这个非正常情况出现也是很频繁的,而且当这种情况出现后我们根本就不知道,一段出现就会导致应用程序莫名奇妙的异常。

[ 本帖最后由 xiaofei104 于 2005-11-6 20:06 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP