Как gcc реализует развертывание стека для исключений C++ в Linux?

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

  •  01-07-2019
  •  | 
  •  

Вопрос

Как gcc реализует развертывание стека для исключений C++ в Linux?В частности, как он узнает, какие деструкторы вызывать при развертывании кадра (т. е. какая информация хранится и где)?

Это было полезно?

Решение

См. раздел 6.2 x86_64 АБИ.Здесь подробно описан интерфейс, но не много базовых данных.Это также не зависит от C++ и, возможно, может использоваться и для других целей.

В основном есть два раздела двоичного файла ELF, создаваемого gcc, которые представляют интерес для обработки исключений.Они есть .eh_frame и .gcc_except_table.

.eh_frame соответствует формату DWARF (формат отладки, который в первую очередь используется при использовании gdb).Он имеет точно такой же формат, как и .debug_frame раздел, создаваемый при компиляции с -g.По сути, он содержит информацию, необходимую для возврата к состоянию машинных регистров и стека в любой точке выше стека вызовов.Дополнительную информацию об этом см. в Стандарте гномов на сайте dwarfstd.org.

.gcc_except_table содержит информацию об обработке исключений «посадочные площадки» и расположение обработчиков.Это необходимо для того, чтобы знать, когда прекратить раскручиваться.К сожалению, этот раздел плохо документирован.Единственные фрагменты информации, которые мне удалось почерпнуть, взяты из списка рассылки gcc.См. особенно эта почта

Оставшаяся часть информации — это то, какой фактический код интерпретирует информацию, содержащуюся в этих разделах данных.Соответствующий код находится в libstdc++ и libgcc.Я сейчас не могу вспомнить, какие части в каких живут.Интерпретатор информации о кадре вызова DWARF можно найти в исходном коде gcc в файле gcc/unwind-dw.c.

Другие советы

В настоящее время доступно не так уж много документации, однако основная система заключается в том, что GCC преобразует блоки try/catch в вызовы функций а потом ссылки в библиотеке с необходимой поддержкой времени выполнения (документация о коде построения дерева включает в себя утверждение «выдача исключения не представлена ​​напрямую в GIMPLE, поскольку оно реализуется путем вызова функции»).

К сожалению, я не знаком с этими функциями и не могу сказать вам, на что обратить внимание (кроме источника libgcc, который включает в себя среду выполнения обработки исключений).

Есть "Обработка исключений для новичков"Документ имеется.

Хотя это похоже на Itanium, предположительно реализация аналогична и для x86: обработка исключений ABI

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top