¿Cómo implementa gcc el desenrollado de la pila para las excepciones de C++ en Linux? En particular, ¿cómo sabe qué destructores llamar al desenrollar un marco (es decir, qué tipo de información se almacena y dónde se almacena)?¿Cómo implementa gcc el desenrollado de la pila para las excepciones de C++ en Linux?
Respuesta
Ver la sección 6.2 del x86_64 ABI. Esto detalla la interfaz pero no muchos de los datos subyacentes. Esto también es independiente de C++ y podría concebirse también para otros fines.
Existen principalmente dos secciones del binario ELF emitidas por gcc que son de interés para el manejo de excepciones. Son .eh_frame
y .gcc_except_table
.
.eh_frame
sigue el formato DWARF (el formato de depuración que principalmente entra en juego cuando se usa gdb). Tiene exactamente el mismo formato que la sección .debug_frame
emitida al compilar con -g
. Esencialmente, contiene la información necesaria para regresar al estado de los registros de la máquina y la pila en cualquier punto más arriba de la pila de llamadas. Ver el Dwarf Standard en dwarfstd.org para más información sobre esto.
.gcc_except_table
contiene información sobre la excepción del manejo de "plataformas de aterrizaje" en las ubicaciones de los manipuladores. Esto es necesario para saber cuándo dejar de desenrollarse. Lamentablemente, esta sección no está bien documentada. Los únicos fragmentos de información que he podido obtener provienen de la lista de correo de gcc. Ver particularmente this post
La información restante es entonces lo que el código real interpreta la información encontrada en estas secciones de datos. El código relevante vive en libstdC++ y libgcc. No recuerdo en este momento qué piezas viven en qué. El intérprete para la información de marco de llamada DWARF se puede encontrar en el código fuente de gcc en el archivo gcc/unwind-dw.c
Aunque esto parece ser para Itanium, presumiblemente, la aplicación es similar para x86: exception handling ABI
No hay mucha documentación disponible actualmente, sin embargo, el sistema básico es que GCC traduce bloques try/catch a function calls y luego links in a library with the needed runtime support (documentation about the tree building code) incluye la instrucción "lanzar una excepción no se representa directamente en GIMPLE, ya que se implementa llamando a una función").
Desafortunadamente no estoy familiarizado con estas funciones y no puedo decirle qué buscar (aparte del origen de libgcc, que incluye el tiempo de ejecución de manejo de excepciones).
Existe un documento "Exception Handling for Newbies" disponible.
- 1. Desenrollado de pila en HP-UX y Linux
- 2. Cómo detectar el desenrollado de la pila en un Destructor
- 3. ¿Qué es el desenrollado de la pila?
- 4. Java y C++ en problema de desenrollado de pila
- 5. traza cómo se puede imprimir la pila de excepciones atrapados en C++ y la inyección de código en C++
- 6. Cómo obtener la pila de pila nativa de las excepciones nativas capturadas en el código administrado
- 7. ¿Cómo se implementa el manejo de excepciones por los lenguajes de programación?
- 8. GCC - Cómo realinear la pila?
- 9. Comportamiento diferente Pila de desenrollado en x64 y x32
- 10. Las excepciones no se detectan en el programa GCC
- 11. Continuaciones/Corutinas/Generadores en C++/gcc/linux
- 12. Aumente el tamaño de la pila en Linux con setrlimit
- 13. ¿Cómo funcionan las excepciones (detrás de escena) en C++
- 14. Manejo de excepciones en C sin C++ en Linux
- 15. c & gcc: Crecimiento y alineación de la pila: para una máquina de 64 bits
- 16. Reanudar C# una excepción: cómo obtener la pila de excepciones en el IDE?
- 17. Manejo de excepciones en linux
- 18. Cambiar tamaño de la pila para una aplicación C++ en Linux durante la compilación con el compilador GNU
- 19. Función de llamada C con diferente puntero de pila (gcc)
- 20. Forzar gcc para pasar los parámetros en la pila
- 21. Incluye con el Enlazador GCC de Linux
- 22. ¿Cómo compilar para Windows en Linux con gcc/g ++?
- 23. ¿Qué es la pila de Linux?
- 24. Modelos de manejo de excepciones de GCC
- 25. ¿Cómo se interceptan las excepciones asignadas en la pila más allá de su alcance?
- 26. Aumentar tamaño de pila en Windows (GCC)
- 27. ¿Cómo implementa el compilador de C las funciones con números de variable de argumentos?
- 28. Instalación de gcc en linux sin compilador c
- 29. Cómo saltarse las excepciones no controladas en Silverlight
- 30. ¿Cómo se implementa la llamada al sistema en Linux?
GCC sigue el IANium ABI siempre que sea posible cuando no exista un ABI para esa plataforma. Esto incluye x86 y x86-64. – Branan