在 *nix .so 库中,在加载和卸载库时是否有系统调用的入口点?
更实用的一点是:如果 .so 是用 C++ 编写的,并且它包含带有构造函数和析构函数的全局对象,并且它是从没有构造/销毁概念的语言加载的,那么全局对象是否正确构造/销毁?
在 *nix .so 库中,在加载和卸载库时是否有系统调用的入口点?
更实用的一点是:如果 .so 是用 C++ 编写的,并且它包含带有构造函数和析构函数的全局对象,并且它是从没有构造/销毁概念的语言加载的,那么全局对象是否正确构造/销毁?
您可以使用 __attribute__((constructor))
和 __attribute__((destructor))
在共享库的加载和卸载时执行代码。
不,没有等效于 DllMain。
对于 JNI 库,例如在 Android 上,可能有一个特殊的条目 JNI_OnLoad 旨在填充 JNI 函数表。
GCC 定义了特殊的属性构造函数来允许一些代码在共享库加载时运行。
C++ 保证将执行全局和静态对象的构造函数,无论加载 .so 的代码是否知道这些类,或者是否具有构造概念。
析构函数也是如此,但是当至少某些析构函数没有机会运行时,可能会出现不愉快的情况 - 例如,当存在 sigfault 并且异常被禁用时。
使用的技术略有不同,但全局对象的构造/销毁或多或少内置于动态加载器中。(即使在 Windows 下,也不需要经过
DllMain
. 无论如何,全局对象将被正确构造/破坏。)