在 *nix 中,是否有一个入口点在库被加载和卸载时被系统调用的 .so 库?
更实际的问题是:如果 .so 是用 C++ 编写的,并且其中包含具有构造函数和析构函数的全局对象,并且它从一个没有构造/析构概念的语言中加载,那么全局对象是否正确地构造/析构?
更实际的问题是:如果 .so 是用 C++ 编写的,并且其中包含具有构造函数和析构函数的全局对象,并且它从一个没有构造/析构概念的语言中加载,那么全局对象是否正确地构造/析构?
您可以使用 __attribute__((constructor))
和 __attribute__((destructor))
在共享库加载和卸载时执行代码。
没有与DllMain等价的函数。
对于JNI库,例如在Android上,可能会有一个特殊入口JNI_OnLoad,旨在填充JNI函数表。
GCC定义了特殊属性constructor,允许在共享库加载时运行某些代码。
C++保证全局和静态对象的构造函数将被执行,无论加载.so的代码是否意识到这些类或已经构造。
同样适用于析构函数,但在某些不幸的情况下可能会有一些析构函数无法运行 - 例如发生sigfault且异常被禁用。
__attribute__((constructor))
的函数将在dlopen()
返回之前执行。 - Alex Cohn所使用的技术略有不同,但全局对象的构造/销毁基本上内置于动态加载器中。(即使在Windows下,也无需通过DllMain
。全局对象将正确地构造/销毁。)