在C / C ++中是否有任何方法可以检测代码是否在静态初始化期间运行?

时间:2010-07-20 16:31:17

标签: c++ shared-libraries static-initialization

我正在编写一个可用作DLL的跟踪库。它基本上被我系统中的每个组件使用。一个棘手的要求是,即使在main()运行之前,也需要在进程生命周期的早期调用跟踪函数。

此库的消费者包括可执行文件,静态链接的DLL,延迟加载的DLL和动态加载的DLL。所有的变化。

某些跟踪功能对静态初始化不起作用,但其他功能很好。理想情况下,我希望能够在初始化时为消费者提供最小的安全功能,然后在初始化完成后提供完整的功能。

要求消费者明确表示“我已完成初始化”调用本身是行不通的,因为某些消费者本身就是DLL并且无法控制托管它们的可执行文件。同样的问题只是将一个级别向上移动。

我希望有一种方法让我可以询问运行时是否或者我当前正在静态初始化中运行,或者该阶段是否已完成。这样的事情有可能吗?

为了进一步复杂化,我需要在5个平台上运行。我不需要一次性写入解决方案,但我确实需要在所有平台上以某种方式使用它。

3 个答案:

答案 0 :(得分:1)

全局变量?类似的东西:

bool initTime = true;
在你的DLL中

然后

int main()
{
  initTime = false;
  // your main code comes here
}

在您的可执行文件中。

答案 1 :(得分:0)

你写的那个

  

某些跟踪功能不能很好地发挥作用   静态初始化但其他   很好。

但是,大多数情况下问题不在于可执行文件(进程)的静态初始化阶段,而是在/ a DLL的静态初始化阶段。 您必须知道每个DLL都有自己的静态初始化阶段,因为它的静态C ++对象。特别是你的跟踪DLL也有,所以任何其他可能使用你的DLL的DLL。

总结一下:可能你不关心可执行文件的静态初始化阶段是否已经完成,但你关心a)你自己的DLL是否已经完成初始化和b)如果你在调用你的DLL Loader Lock当前持有。

关于a)如果你的DLL已经完成初始化只是代码中的一个问题,因为没有人可以在初始化之前调用你的DLL。

至于b)似乎没有(便携式,文档化)方式从代码中确定当前是否正在装载加载器锁。除了清楚地记录在装载锁定时不能调用哪些功能,我不知道任何其他方式。

答案 2 :(得分:0)

您可能需要重写(好,修改),然后与重写的crt0.o链接。对于每个平台来说,显然必须有所不同。