Linux相当于DllMain

Sev*_*yev 22 c++ shared-libraries shared-objects

在*nix .so库中,是否有一个入口点在系统加载和卸载时由系统调用?

更实际的说明:如果.so是用C++编写的,它包含带有构造函数和析构函数的全局对象,并且它是从没有构造/破坏概念的语言加载的,那么全局对象是否正确构造/破坏了?

dor*_*ron 17

您可以使用 __attribute__((constructor))__attribute__((destructor))在加载和卸载共享库时执行代码.


Ale*_*ohn 12

  1. 不,没有相当于DllMain的东西.

  2. 对于JNI库,例如在Android上,可能有一个特殊的条目JNI_OnLoad,用于填充JNI函数表.

  3. GCC定义了特殊的属性构造函数,允许一些代码在共享库加载时运行.

  4. C++保证无论加载.so的代码是否知道这些类,或者具有构造的概念,都将执行全局和静态对象的构造函数.

    对于析构函数也是如此,但是当至少有一些析构函数没有机会运行时可能会出现不愉快的情况 - 例如,当存在sigfault且异常被禁用时.

  • 不完全是.DllMain为附加的每个线程运行 - 在Linux中没有类似的东西.而且,正如James Kanze所述,全局对象构造函数由运行时库运行,而不是通过DllMain机制运行. (3认同)
  • @SevaAlekseyev:合同是带有`__attribute __((constructor))`的函数将在`dlopen()`返回之前执行. (2认同)

Jam*_*nze 6

使用的技术略有不同,但全局对象的构造/破坏或多或少地内置于动态加载器中.(即使在Windows下,也没有必要通过 DllMain.无论如何,全局对象将被正确构造/破坏.)