2010-03-12 21 views
15

Después de compilar de archivo C++ (con objeto estático global) me meto en nm salida de esta función:g ++ __static_initialization_and_destruction_0 (int, int) - ¿qué es lo

00000000 t _Z41__static_initialization_and_destruction_0ii 

__static_initialization_and_destruction_0(int, int) /* after c++filt */ 

¿Qué es? Se llamará __cxa_atexit()

¿Puedo desactivar la generación de esta función (y llamar a un __cxa_atexit()) y poner todas las llamadas de constructor y el destructor de .ctors y .dtors secciones?

+2

g ++ tiene una opción de línea de comando '-fno-use-cxa-atexit', pero no creo que eso ayude. Parece que solo hace que se use 'atexit()' en lugar de 'cxa_atexit()'. Quizás la mejor pregunta es por qué g ++ genera '__static_initialization_and_destruction_0()' para empezar, en lugar de colocar llamadas de constructor y destructor en las secciones ELF '.ctors' y' .dtors'. Presumiblemente hay una buena razón para eso. – Void

Respuesta

14

archivo Este documento parece decir ya todo lo que querrías saber acerca de esas funciones: http://www.nsnam.org/docs/linker-problems.doc

De lo que puedo asimilar, gcc crea una __static_initialization_and_destruction_0 por cada unidad de traducción que necesita constructores estáticos para ser llamados. Luego coloca __do_global_ctors_aux en la sección .ctors, que luego llama al __static_initialization_and_destruction_0 en cada unidad de traducción.

El problema parece ser mucho más complejo que eso; gcc tiene que tratar con archivos de objetos individuales en un archivo, y creo que así es como evitan que el vinculador optimice esas llamadas.