dll的代码段不共享吗?

jsphuang 2012-12-23 03:23:06
一直以为dll的代码在内存中只有一份,看到结果吓了一跳,进程的地址空间中显示dll的.text段 居然是private ws,但是exe的.text段是sharable ws的,哪位高人能解释一下吗?
...全文
428 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jsphuang 2013-01-10
  • 打赏
  • 举报
回复
mydll.dll的默认imageBase 的地址是:0x10000000 ,加载到testAPP.exe的时候被rebase了,我理解有误,ws2_32.dll的imagebase 的地址是:0x71A20000。 只要发生rebase后,DLL的代码段在内存中就不共享了吗?哪里能找到资料参考一下?
jsphuang 2013-01-10
  • 打赏
  • 举报
回复
看了一下加载时重定位技术,大概有些明白了,可是这个不是DLL代码段不共享的充分条件, 发现有些时候dll即时被rebase了,代码段还是共享的 再次谢谢wocow3
wocow3 2013-01-09
  • 打赏
  • 举报
回复
引用 6 楼 jsphuang 的回复:
谢谢楼上的! to wocow3: 我看了自己写的mydll.dll在启动的2个testAPP.exe进程的地址空间的加载地址都是01620000,没有发生rebase现象,但是.text段显示就是private ws;我又看了一下ws2_32.dll的加载地址为71A20000,显示.text段是Shareable WS,我的系统是xp的,按照DLL代码在内存中……
link默认设置生成的DLL的加载地址是0x10000000,01620000地址恰恰说明rebase了 用depend看看DLL的perfered base是多少
jsphuang 2013-01-09
  • 打赏
  • 举报
回复
谢谢楼上的! to wocow3: 我看了自己写的mydll.dll在启动的2个testAPP.exe进程的地址空间的加载地址都是01620000,没有发生rebase现象,但是.text段显示就是private ws;我又看了一下ws2_32.dll的加载地址为71A20000,显示.text段是Shareable WS,我的系统是xp的,按照DLL代码在内存中只有一份的说法,为什么我的mydll.dll和ws2_32.dll会出现不一样的结果呢? to xianglitian: 一个地址空间使用私有物理内存,一个地址空间使用共享的物理内存; 都是DLL代码段(.text)在进程地址空间中看到的属性。
向立天 2013-01-03
  • 打赏
  • 举报
回复
你说的这两个是地址索引吧
jimette 2013-01-02
  • 打赏
  • 举报
回复
DING BUDONG
wocow3 2013-01-02
  • 打赏
  • 举报
回复
这个很正常,如果DLL发生rebase,也就是实际加载地址跟DLL预设加载地址不一致的话,.text就会变成private ws。
王林森 2013-01-02
  • 打赏
  • 举报
回复
貌似会被修改的部分在内存分配的时候都是用的写时复制write_copy,把要修改的部分复制了一份映射到进程的地址空间。具体咋咋地的忘了,瞧我这记性,windows核心编程上貌似有。
jsphuang 2012-12-24
  • 打赏
  • 举报
回复
难道分不够?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧