Comment gcc implémente-t-il le dépilage de pile pour les exceptions C ++ sur linux?

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

  •  01-07-2019
  •  | 
  •  

Question

Comment gcc implémente-t-il le dépilage de pile pour les exceptions C ++ sur linux? En particulier, comment peut-il savoir quels destructeurs appeler lors du déroulement d’une trame (c’est-à-dire quel type d’information est stocké et où est-il stocké)?

Était-ce utile?

La solution

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 éventuellement être utilisé à d’autres fins.

Il existe principalement deux sections du fichier binaire ELF émises par gcc qui présentent un intérêt pour la gestion des exceptions. Ce sont .eh_frame et .gcc_except_table .

.eh_frame suit le format DWARF (le format de débogage qui entre principalement en jeu lorsque vous utilisez gdb). Son format est identique à celui de 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 en un point situé plus haut dans la pile des appels. Voir le Standard des Nains sur dwarfstd.org pour plus d'informations à ce sujet.

.gcc_except_table contient des informations sur la gestion des exceptions " pads "& d'atterrissage". les emplacements des manutentionnaires. Cela est nécessaire pour savoir quand arrêter de se dérouler. Malheureusement, cette section n’est pas bien documentée. Les seuls extraits d’informations que j’ai pu glaner proviennent de la liste de diffusion de gcc. Voir plus particulièrement ce message

L’information restante est alors le code qui interprète l’information trouvée dans ces sections de données. Le code correspondant réside dans libstdc ++ et libgcc. Je ne me souviens pas pour l'instant des pièces dans lesquelles vivent. L'interpréteur des informations de cadre d'appel DWARF se trouve dans le code source gcc du fichier gcc / unwind-dw.c

Autres conseils

Il n’ya pas beaucoup de documentation actuellement disponible, mais le système de base est que GCC traduit les blocs try / catch en appels de fonction , puis liens dans une bibliothèque avec le support d'exécution nécessaire ( la documentation sur le code de construction de l'arborescence inclut la déclaration "Le lancement d'une exception n'est pas directement représenté dans GIMPLE, car il est implémenté en appelant une fonction").

Malheureusement, je ne connais pas bien ces fonctions et je ne peux pas vous dire quoi regarder (autre que la source de libgcc - qui inclut l'exécution de la gestion des exceptions).

Il existe un " gestion des exceptions pour les débutants " document disponible.

Bien que cela semble concerner Itanium, sa mise en œuvre est probablement similaire pour x86: gestion des exceptions ABI

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top