Come si fa a gcc implementare stack di svolgimento per le eccezioni C++ su linux?

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

  •  01-07-2019
  •  | 
  •  

Domanda

Come si fa a gcc implementare stack di svolgimento per le eccezioni C++ su linux?In particolare, come fa a sapere che i distruttori da chiamare in caso di svolgimento di un frame (cioè, che tipo di informazioni vengono memorizzate e dove sono salvati)?

È stato utile?

Soluzione

Vedere la sezione 6.2 del x86_64 ABI.Questo in dettaglio l'interfaccia, ma non un sacco di dati sottostante.Questo è anche indipendente di C++ e potrebbero essere utilizzati per altri scopi.

Ci sono principalmente due sezioni di binari ELF come emessa dal gcc che sono di interesse per la gestione delle eccezioni.Sono .eh_frame e .gcc_except_table.

.eh_frame segue il NANO formato (il formato di debug, che prima di tutto entra in gioco quando si utilizza gdb).Ha esattamente lo stesso formato come il .debug_frame sezione emessa durante la compilazione con -g.In sostanza, esso contiene le informazioni necessarie per pop allo stato della macchina, registri e lo stack in qualsiasi punto in più lo stack di chiamate.Vedere il Nano Standard dwarfstd.org per ulteriori informazioni su questo.

.gcc_except_table contiene informazioni sulla gestione delle eccezioni "landing pad" le posizioni dei gestori.Questo è necessario in modo da sapere quando smettere di rilassarsi.Purtroppo in questa sezione non è ben documentata.Il solo frammenti di informazioni che ho potuto raccogliere venire da gcc mailing list.Si veda in particolare questo post

Il restante pezzo di informazioni è quindi qual è il reale codice interpreta le informazioni presenti in queste sezioni di dati.Il codice in questione vive in libstdc++ e libgcc.Non ricordo al momento quale i pezzi dal vivo, in cui.L'interprete per il NANO chiamata telaio informazioni possono essere trovate nel codice sorgente di gcc nel file gcc/relax-dw.c

Altri suggerimenti

Non c'è molta documentazione attualmente disponibile, tuttavia il sistema di base è che il GCC si traduce blocchi try/catch per chiamate di funzione e poi i collegamenti in una libreria, con il necessario supporto in fase di runtime (documentazione circa la costruzione dell'albero di codice include l'istruzione "la generazione di un'eccezione non è direttamente rappresentato in GIMPLE, dal momento che essa è attuata mediante la chiamata di una funzione").

Purtroppo non ho familiarità con queste funzioni e non posso dirvi di cosa guardare (di diversa origine per libgcc-che include la gestione delle eccezioni runtime).

C'è un "La Gestione delle eccezioni per i Neofiti"documento disponibile.

Anche se questo sembra essere per Itanium, presumibilmente, l'attuazione è simile per x86: la gestione delle eccezioni ABI

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top