Как gcc реализует развертывание стека для исключений C ++ в Linux? - PullRequest
18 голосов
/ 18 сентября 2008

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

Ответы [ 3 ]

12 голосов
/ 22 декабря 2010

См. Раздел 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

2 голосов
/ 18 сентября 2008

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

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

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

2 голосов
/ 18 сентября 2008

Хотя это выглядит для Itanium, по-видимому, реализация для x86 аналогична: обработка исключений ABI

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...