2008-09-17 6 views

Répondre

12

Voir la section 6.2 de la x86_64 ABI. Ceci détaille l'interface mais pas beaucoup de données sous-jacentes. Ceci est également indépendant de C++ et pourrait également être utilisé à d'autres fins.

Il existe principalement deux sections du binaire ELF comme émis par gcc qui sont d'intérêt pour la gestion des exceptions. Ils sont .eh_frame et .gcc_except_table.

.eh_frame suit le format DWARF (le format de débogage qui est principalement utilisé lorsque vous utilisez gdb). Il a exactement le même format que la section .debug_frame émise lors de la compilation avec -g. Essentiellement, il contient les informations nécessaires pour revenir à l'état des registres de la machine et de la pile à n'importe quel point plus haut dans la pile des appels. Voir le Standard Nain à dwarfstd.org pour plus d'informations à ce sujet.

.gcc_except_table contient des informations sur la gestion des exceptions « aires d'atterrissage » les emplacements des gestionnaires. Ceci est nécessaire pour savoir quand arrêter le déroulement. Malheureusement, cette section n'est pas bien documentée. Les seuls extraits d'information que j'ai pu glaner proviennent de la liste de diffusion gcc. Voir en particulier this post

La partie restante de l'information est alors ce code réel interprète les informations contenues dans ces sections de données. Le code correspondant réside dans libstdC++ et libgcc. Je ne peux pas me rappeler pour le moment quelles pièces vivent dans lesquelles. L'interpréteur pour les informations de trame d'appel DWARF peut être trouvé dans le code source gcc dans le fichier gcc/unwind-dw.c

2

Bien que cela semble être pour les systèmes Itanium, sans doute la mise en œuvre est similaire pour x86: exception handling ABI

+0

GCC suit l'ABI Itanium dans la mesure du possible lorsqu'il n'y a pas d'ABI existant pour cette plate-forme. Cela inclut x86 et x86-64. – Branan

2

Il n'y a pas beaucoup de documentation actuellement disponible, mais le système de base est que GCC traduit essayer/blocs catch à function calls puis links in a library with the needed runtime support (documentation about the tree building code inclut l'instruction "lancer une exception n'est pas directement représentée dans GIMPLE, car elle est implémentée en appelant une fonction").

Malheureusement, je ne suis pas au courant de ces fonctions et ne peux pas vous dire ce qu'il faut regarder (autre que la source de libgcc - qui comprend le moteur d'exécution de la gestion des exceptions).

Il y a un document "Exception Handling for Newbies" disponible.

Questions connexes