Linux相当于DllMain

时间:2012-09-17 16:44:29

标签: c++ shared-libraries shared-objects

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

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

3 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:11)

  1. 不,没有相当于DllMain。

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

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

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

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

答案 2 :(得分:5)

使用的技术有点不同,但是 全球物体的建造/破坏或多或少地融入其中 动态加载器。 (即使在Windows下,也没有必要通过 DllMain。将正确构造/破坏全局对象 无论如何。)