Windows的DLL是否实现了如Linux的.so文件一样的共享?

iCode王者伟业 2016-05-24 06:57:21
《程序员的自我修养》这本书中讲到,Linux下实现动态库时,为了实现同样的代码被多个进程共享,而大费周折的使用地址无关码(PIC)机制,同时因为每个进程的地址空间不同,所以不能用基址重定位的方式实现共享。
可是在Windows下实现动态库时,却明明白白的用了重定基址(Rebasing)的方式,而没有使用地址无关码。
那么Windows下的动态库实现了代码的多个进程的共享吗?
...全文
370 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-05-25
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!) VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
paschen 2016-05-25
  • 打赏
  • 举报
回复
lm_whales 2016-05-24
  • 打赏
  • 举报
回复
Windows 早期采用两种方式 1)固定地址方式 操作系统某些模块就是这样的 2)重定位模式 当一个DLL不能加载在他的缺省位置的时候,就需要重定位一下 出于安全,或者别的原因考虑,也可以重定位一下 动态库共享代码很容易啊 只是共享变量比较麻烦
mLee79 2016-05-24
  • 打赏
  • 举报
回复
代码当然共享. PE也就要多做一次基址重定位而已, DLL 是 COW 的, 你加载到不同的地址上了, 只是让重定位后的基址相关的几个 PAGE 单独占用了一份空间罢了. PIC 代码加载起来就简单多了, 只是在 x86 这种寄存器少的如此奇葩的CPU上, PIC 代码多占用个寄存器存放 GOT, 实在是太浪费了, 在 x86_64 , arm , mips 啊这些寄存器一堆或者直接可以用 PC 寻址的机器上就无所谓啦....
  • 打赏
  • 举报
回复
当然是共享的
dustpg 2016-05-24
  • 打赏
  • 举报
回复
资源监视器中,可共享内存不就是指的这个么。。。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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