是完全加载DLL还是只加载某些函数?

Gui*_*e07 6 c++ dll

当程序使用动态共享库时,它是否完全加载DLL(因此您可以在应用程序运行期间几乎从磁盘擦除DLL)或者在运行时期间每次根据需要加载DLL的一部分申请的生命?

Naw*_*waz 5

DLL完全加载.DLL在几乎所有方面都与EXE相同; 唯一的它们之间的区别是,DLL是不可执行的.它没有main()功能 - 程序的开始.

  • @Armen:`DllMain`是可选的.使用`/ NOENTRYPOINT`链接器时可以省略它. (2认同)

dat*_*olf 5

我不知道 Windows 中的细节是如何工作的(在 Linux 中我非常了解内核中的负责代码),但至少在 *nix 系统中,只要有文件描述符/句柄,删除文件系统条目就会保持文件内容完好无损打开它。仅在关闭最后一个文件描述符/句柄后,存储设备上的块可能会被覆盖。Windows 经过 POSIX 认证,因此它遵循此行为。

DLL不会加载到预分配的内存中。它们是内存映射的。这会导致交换内存的逆转。文件的内容不是将 RAM 交换到磁盘,而是映射到进程地址空间,并最终通过磁盘/文件缓存存储在 RAM 中。*nix 操作系统中的共享对象也是如此。但 Windows 和 *nix 系统在处理重定位、符号导出等方面存在显着差异。