Wie funktioniert implementieren gcc Stack Abrollen für C ++ Ausnahmen auf Linux?

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

  •  01-07-2019
  •  | 
  •  

Frage

Wie implementieren gcc Stack Abrollen für C ++ Ausnahmen auf Linux? Insbesondere woher weiß es, die Destruktoren aufrufen, wenn ein Rahmen Abrollen (das heißt, welche Art von Informationen gespeichert sind und wo sie gespeichert sind)?

War es hilfreich?

Lösung

Siehe Abschnitt 6.2 des x86_64 ABI . Diese beschreibt die Schnittstelle aber nicht viel von den zugrunde liegenden Daten. Das ist auch unabhängig von C ++ und könnte möglicherweise auch für andere Zwecke verwendet werden.

Es in erster Linie zwei Abschnitte der ELF-Binaries sind als von gcc emittieren, die für die Ausnahmebehandlung von Interesse ist. Sie sind .eh_frame und .gcc_except_table.

.eh_frame folgt das ZWERG-Format (das Debug-Format, das ins Spiel kommt in erster Linie, wenn Sie gdb verwenden). Es hat genau das gleiche Format wie der .debug_frame Abschnitt emittiert wird, wenn mit -g kompilieren. Im Wesentlichen enthält er die notwendigen Informationen zurück zu dem Zustand der Maschine Registern und den Stapel an jedem Punkt weiter oben in der Aufrufliste Pop. Siehe den Dwarf-Standard in dwarfstd.org für weitere Informationen zu diesem Thema.

.gcc_except_table enthält Informationen über die Ausnahmebehandlung „Landeplätze“ die Standorte der Handler. Dies ist notwendig, um zu wissen, wann Abwickeln zu stoppen. Leider ist dieser Abschnitt nicht gut dokumentiert. Die einzigen Auszüge Informationen, die ich in der Lage gewesen von der gcc-Mailingliste zu aufzulesen kommen. Siehe insbesondere diesen Beitrag

Der restliche Teil der Information ist dann, was tatsächlicher Code, um die Informationen in diesen Daten Abschnitten interpretiert. Der entsprechende Code lebt in libstdc ++ und libgcc. Ich kann im Moment die Stücke leben, in der sich nicht erinnern. Der Dolmetscher für die ZWERG Anruf Rahmeninformationen kann in dem gcc-Quellcode in der Datei gcc / entspannen-dw.c

finden

Andere Tipps

Es gibt nicht viel Dokumentation ist derzeit jedoch das Basissystem besteht darin, dass GCC übersetzt try / catch-Blöcke auf Funktion aufruft und dann Links in einer Bibliothek mit der benötigten Laufzeitunterstützung ( Dokumentation über den Baum Bauordnung die Anweisung enthält „Auslösen einer Ausnahme wird in GIMPLE nicht direkt vertreten, da sie durch den Aufruf einer Funktion implementiert ist“).

Leider mit diesen Funktionen Ich bin nicht vertraut und können Ihnen nicht sagen, was (als Quelle für libgcc andere -, die die Ausnahmebehandlung Laufzeit enthält), zu betrachten.

Es gibt eine " Exception Handling für Newbies " Dokument zur Verfügung.

Obwohl dies für Itanium sein aussieht, vermutlich ist die Implementierung ähnlich für x86: Ausnahmebehandlung ABI

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top