¿Cómo implementa gcc el desarrollo de la pila para excepciones de C++ en Linux?

StackOverflow https://stackoverflow.com/questions/87220

  •  01-07-2019
  •  | 
  •  

Pregunta

¿Cómo implementa gcc el desarrollo de la pila para excepciones de C++ en Linux?En particular, ¿cómo sabe qué destructores llamar al desenrollar un cuadro (es decir, qué tipo de información se almacena y dónde se almacena)?

¿Fue útil?

Solución

Véase 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 posiblemente también podría usarse para otros fines.

Hay principalmente dos secciones del binario ELF emitido por gcc que son de interés para el manejo de excepciones.Ellos son .eh_frame y .gcc_except_table.

.eh_frame sigue el formato DWARF (el formato de depuración que entra en juego principalmente cuando usas gdb).Tiene exactamente el mismo formato que el .debug_frame sección emitida al compilar con -g.Básicamente, contiene la información necesaria para volver al estado de los registros de la máquina y la pila en cualquier punto superior de la pila de llamadas.Consulte el Estándar enano en dwarfstd.org para obtener más información al respecto.

.gcc_except_table contiene información sobre la excepción que maneja las "plataformas de aterrizaje" y las ubicaciones de los controladores.Esto es necesario para saber cuándo dejar de relajarse.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 esta publicación

La información restante es entonces qué código real interpreta la información que se encuentra en estas secciones de datos.El código relevante se encuentra en libstdc++ y libgcc.No puedo recordar en este momento qué piezas viven en cuáles.El intérprete de la información del marco de llamada DWARF se puede encontrar en el código fuente de gcc en el archivo gcc/unwind-dw.c

Otros consejos

No hay mucha documentación disponible actualmente, sin embargo, el sistema básico es que GCC traduce los bloques try/catch a llamadas a funciones y luego enlaces en una biblioteca con el soporte de tiempo de ejecución necesario (documentación sobre el código de construcción de árboles incluye la declaración "lanzar una excepción no está representado directamente en GIMPLE, ya que se implementa llamando a una función").

Desafortunadamente, no estoy familiarizado con estas funciones y no puedo decirle qué mirar (aparte de la fuente de libgcc, que incluye el tiempo de ejecución de manejo de excepciones).

Hay un "Manejo de excepciones para novatos"Documento disponible.

Aunque esto parece ser para Itanium, presumiblemente la implementación es similar para x86: manejo de excepciones ABI

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top