2008-09-17 11 views

Respuesta

12

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

2

Aunque esto parece ser para Itanium, presumiblemente, la aplicación es similar para x86: exception handling ABI

+0

GCC sigue el IANium ABI siempre que sea posible cuando no exista un ABI para esa plataforma. Esto incluye x86 y x86-64. – Branan

2

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.

Cuestiones relacionadas