make library example c++ shared-libraries shared-objects

c++ - example - make shared library gcc



Linux equivalente de DllMain (3)

  1. No, no hay equivalente a DllMain.

  2. Para las bibliotecas JNI, por ejemplo, en Android, puede haber una entrada especial JNI_OnLoad que está destinada a llenar la tabla de funciones JNI.

  3. GCC define el constructor de atributos especiales para permitir que algunos códigos se ejecuten en la carga de la biblioteca compartida.

  4. C ++ garantiza que se realizarán los constructores para objetos globales y estáticos, sin importar si el código que cargó el .so era consciente de estas clases o tenía noción de construcción.

    Lo mismo vale para los destructores, pero puede haber circunstancias infelices cuando al menos algunos destructores no tienen oportunidad de correr, por ejemplo, cuando hay un sigfault y las excepciones están desactivadas.

En las bibliotecas * nix .so, ¿hay un punto de entrada invocado por el sistema cuando se carga y descarga la biblioteca?

En una nota más práctica: si el .so se escribió en C ++ y contiene objetos globales con constructores y destructores, y se carga desde un lenguaje que no tiene noción de construcción / destrucción, ¿se construyen / destruyen adecuadamente los objetos globales?


La técnica utilizada es un poco diferente, pero la construcción / destrucción de objetos globales está más o menos integrada en el cargador dinámico. (Incluso en Windows, no es necesario pasar por DllMain . Los objetos globales se construirán / destruirán correctamente de todos modos).


Puede usar el __attribute__((constructor)) y __attribute__((destructor)) para ejecutar el código en la carga y descarga de la biblioteca compartida.