Как многие люди упоминали в комментариях, G CC статически ссылается на libbacktrace
, который использует libgcc
на платформах ELF (например, Linux) и пользовательский код на AIX и Windows. Предполагая, что большинство людей заинтересуются Linux, я расширяю тот, что ниже.
G CC библиотека времени выполнения (libgcc
) содержит код разматывания стека, который используется для исключений C ++ и сообщений об ошибках . В частности, он используется Glib c ( backtrace (3) ), AddressSanitizer и самим G CC.
Внутренняя реализация раскрутки сильно зависит от цели. Например, на amd64 он использует метаданные макета стека, хранящиеся в разделах .eh_frame
(см. https://uclibc.org/docs/psABI-x86_64.pdf), на ARM он также использует метаданные (но в другом формате), а на i386 он вручную анализирует пролог функции инструкции (для специфичных для платформы c подробностей можно изучить соответствующие файлы раскрутки в https://github.com/gcc-mirror/gcc/tree/master/libgcc).