在dlopen'ing时是否运行静态初始化(和/或其他)代码?

时间:2016-09-16 21:31:34

标签: c++ dlopen shared-objects dynamic-loading static-initialization

当您dlopen()共享对象时,是否有一种机制可以在不明确调用的情况下执行该DLL中的代码?具体来说,dlopen()的调用者可能不知道的全局/静态的C ++静态初始化代码?我很确定答案应该是“是”,但我不记得是什么机制会发生这种情况,以及如何利用它来运行任意代码。

1 个答案:

答案 0 :(得分:3)

是:dlopen尊重ELF二进制格式机制,以便在加载时运行代码。

实际上有两种这样的机制:

  • 旧版本使用特殊的.init.fini部分,其中包含要调用dlopendlclose的函数指针数组。由于这些部分可能在运行时不存在,因此还有DT_INITDT_FINI动态标记指向相应的部分。
  • 较新的机制是.init_array.fini_array以及相应的DT_INIT_ARRAYDT_INIT_ARRAYSZDT_FINI_ARRAYDT_FINI_ARRAYSZ动态代码。

描述了这两种机制之间的差异here

进入源代码级别,如果使用__attribute__((constructor))修饰C函数,编译器将使用这两种机制之一使其在对象dlopen编辑时运行。对于需要动态初始化的全局C ++对象的构造代码也是如此。