Существует ли простое представление DWARF CFI для функций, устанавливающих обычный указатель кадра?

Я программирую на смеси C, C++ и ассемблера, и я хотел бы получить надежные следы от любой части кода.

Это в основном хорошо работает для кода C и C++, поскольку я могу генерировать отладочную информацию с помощью -g, которая для современных компиляторов и платформ x86 генерирует DWARF отладочная информация, означающая, что окончательный двоичный файл включает CFI (информация о кадре вызова). Эта информация позволяет вернуться назад по функциям в текущем стеке вызовов. Он может поддерживать сложные сценарии, такие как функции без базового указателя и где rsp изменяется динамически. Для кода C и C++ мне все равно: компилятор просто генерирует правильный CFI даже для оптимизированного кода.

Для ассемблерного кода x86, который я пишу на nasm, проблема с CFI. Как nasm, так и совместимый с синтаксисом конкурент yasm имеют некоторую ограниченную поддержку генерации информации о DWARF, но в основном используют отображение указателя инструкций на строку и не включают никаких CFI1 (действительно, сборка не может на самом деле это не получится, даже если это необходимо, поскольку ассемблер слишком низкоуровневый, чтобы однозначно выразить семантику вызова/возврата).

Я хотел бы добавить CFI для подпрограмм, сгенерированных сборкой, но мне не нужна полная гибкость CFI для идентификации CFA на основе гранулярных изменений инструкций в rsp и т. д.: я совершенно счастлив установить стандарт указатель кадра в rbp для каждой функции сборки и оставить его нетронутым для всей функции. Поддерживает ли DWARF3 этот сценарий с помощью простого бита информации CFI, который, надеюсь, я смогу сгенерировать с помощью макроса на ассемблере?


1 Экспериментальная "nextgen" версия yasm поддерживает CFI директивы, но этот проект не обновлялся 5 лет. Существует открытая проблема по переносу этой поддержки обратно в основную версию yasm.


person BeeOnRope    schedule 31.10.2017    source источник