См. Раздел 6.2 x86_64 ABI . Это детализирует интерфейс, но не много базовых данных. Это также не зависит от C ++ и, возможно, может быть использовано и для других целей.
Существует в основном две секции двоичного файла ELF, испускаемого gcc, которые представляют интерес для обработки исключений. Это .eh_frame
и .gcc_except_table
.
.eh_frame
соответствует формату DWARF (формат отладки, который в основном вступает в действие при использовании gdb). Он имеет тот же формат, что и секция .debug_frame
, генерируемая при компиляции с -g
. По сути, он содержит информацию, необходимую для возврата к состоянию машинных регистров и стека в любой точке выше стека вызовов. См. Dwarf Standard на dwarfstd.org для получения дополнительной информации об этом.
.gcc_except_table
содержит информацию об исключительной обработке «посадочных площадок» местоположений обработчиков. Это необходимо для того, чтобы знать, когда прекратить разматывание. К сожалению, этот раздел недостаточно хорошо задокументирован. Единственные фрагменты информации, которые я смог собрать, взяты из списка рассылки gcc. В частности этот пост
Тогда оставшаяся часть информации - это то, что фактический код интерпретирует информацию, найденную в этих разделах данных. Соответствующий код находится в libstdc ++ и libgcc. Сейчас я не могу вспомнить, какие части живут в каких. Интерпретатор информации о кадре вызова DWARF можно найти в исходном коде gcc в файле gcc / unwind-dw.c