C++ 加载程序如何将DLL映射到进程地址空间
我很想知道加载程序是如何将DLL映射到进程地址空间的。加载器是如何产生这种魔力的。我们高度赞赏这个榜样C++ 加载程序如何将DLL映射到进程地址空间,c++,c,dll,loader,C++,C,Dll,Loader,我很想知道加载程序是如何将DLL映射到进程地址空间的。加载器是如何产生这种魔力的。我们高度赞赏这个榜样 提前感谢。假设这是在Windows中(DLL提示),您可能需要阅读Microsoft的文档页。它没有详细说明DLL是如何映射到地址空间的;我想你不需要知道这一点。你想要什么样的细节?在基本层面上,所有动态链接器的工作方式基本相同: 动态库被编译成可重定位代码(例如,使用相对跳转而不是绝对跳转) 链接器在应用程序的内存映射中找到适当大小的空白空间,并将DLL代码和任何静态数据读入该空间 动态库包
提前感谢。假设这是在Windows中(DLL提示),您可能需要阅读Microsoft的文档页。它没有详细说明DLL是如何映射到地址空间的;我想你不需要知道这一点。你想要什么样的细节?在基本层面上,所有动态链接器的工作方式基本相同:
如果你真的感兴趣的话,你应该读这本书。好的,我假设这里的内容是Windows方面的。加载PE文件时,加载程序(包含在NTDLL中)将执行以下操作:
DLLMain()
,创建一个开始地址位于PE文件入口点的线程(这也过于简单,因为实际的开始地址位于Win32进程的kernel32.DLL内)还有一句关于DLL上EXE打包程序的警告。它们完全破坏了我描述的CoW机制,它们在加载DLL的进程堆上为DLL的未打包内容分配空间。因此,虽然实际的文件内容仍然映射为MMF并共享,但对于加载DLL的每个进程,未打包的内容占用的内存量相同,而不是共享。@Mark Bessey。在机器级别:)。加载器是如何产生这种魔力的。我喜欢您的描述,如果您能给出解码m/c代码或asm代码的链接/示例来解释bit,我将不胜感激。请慢慢来,不要着急。:)关于DLL的CoW特性的精彩解释。