Я пытаюсь вычислить расположение локальных переменных внутри работающей программы, используя libdwarf. Я имел обыкновение делать это, выполняя DW_OP_fbreg, который в конечном итоге отображался бы в регистр, который был бы основой для этой функции. В более новом стандарте карликов основание кадра — DW_OP_call_frame_cfa. Я не могу найти какую-либо информацию, которая говорит мне, как выполнить DW_OP_call_frame_cfa и вернуться с базовым местоположением кадра. Есть много ссылок на таблицу CFA и кто восстанавливает какие регистры, но я не знаю, как получить эту информацию и как ее применить. Может кто-то заполнить пробелы?
DW_OP_call_frame_cfa
означает, что вы должны использовать информацию о кадре вызова для вычисления CFA; затем вставьте это в стек выражений.
См. Раздел 6.4 («Информация о кадре вызова») стандарта DWARF 4 для объяснения этого. По сути, теперь вы должны прочитать .debug_frame
раздел и декодировать его в соответствии с правилами, описанными в 6.4. Это равносильно написанию другого интерпретатора для другого маленького языка байт-кода; и, возможно, повторно использовать интерпретатор выражений DWARF.
Этот код операции в основном является оптимизацией пространства в DWARF. Компиляторы уже передают информацию о кадре вызова, и этот код операции позволяет им повторно использовать ее для вычисления переменных местоположений.
Других решений пока нет …