【问题标题】:Global constructors and MSVCRT in a DLLDLL 中的全局构造函数和 MSVCRT
【发布时间】:2012-11-26 02:26:57
【问题描述】:

DLL 中的以下代码会发生什么情况?

#include <vector>
std::vector<int> global_vector;

BOOL WINAPI DllMain(HANDLE hModule, DWORD fdwReason, LPVOID lpReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH)
    {
        global_vector.push_back(1);
    }

    return TRUE;
}

... 如果用 /MD 编译?向量的构造函数和 push_back 调用的代码(即内存管理、异常处理......)位于 MSVCRT.DLL 中......据我所知,在这个阶段不能保证被映射。有特殊待遇吗?

【问题讨论】:

  • vector 的代码只有标题;它将完全编译到您的模块中。
  • @JamesMcNellis:并非它所依赖的所有内容都是仅标题。
  • 可能很好,但如果你想安全而不是抱歉,为什么不在 DllMain 之后手动调用一个函数来初始化 DLL?

标签: c++ dll constructor msvcrt


【解决方案1】:

来自here

简而言之,当调用DllMain 时,操作系统加载程序处于相当脆弱的状态。首先,它在其结构上应用了锁,以防止在该调用中发生内部损坏,其次,您的某些依赖项可能未处于完全加载状态。 在加载二进制文件之前,OS Loader 会查看其静态依赖项。如果这些需要额外的依赖关系,它也会查看它们。 作为分析的结果,它提出了一个序列,其中需要调用这些二进制文件中的DllMains。它非常聪明,在大多数情况下,您甚至可以不遵守 MSDN 中描述的大多数规则而侥幸逃脱 - 但并非总是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-28
    • 1970-01-01
    • 2011-09-05
    • 2016-06-10
    • 2017-10-27
    • 2021-06-17
    • 2018-08-11
    • 1970-01-01
    相关资源
    最近更新 更多