Используя gcc, мне нужно отслеживать существование некоторых специальных типов переменных, выделенных в различных процедурах, в качестве локальных переменных. Чтобы сделать это, я думал, чтобы сигнализировать о своем существовании во время компиляции. Поэтому мне нужно во время компиляции метод получить смещение автоматической переменной (переменной с локальной областью) относительно фрейма стека (относительно регистра rbp в архитектурах x86).Как получить смещение автоматической (локальной) переменной относительно фрейма стека (__builtin_frame_address)
Я уже в состоянии получить его следующим образом:
(char*)&a - (char*)__builtin_frame_address(0)
проблема заключается в том, что НКУ не достаточно умна, и генерирует много инструкций для того, что должно быть просто нагрузка постоянная. Так что мне интересно, если случайно есть скрытый макрос или встроенный, который дает мне это прямо, поскольку это тоже самое простое решение.
насчет старого доброго трюка - имея манекен вар первый и принимая разницу в адресах между манекеном и вашей переменной –
Что ты предлагаешь похож к коду, который я включил.Дело в том, что для этого требуется указатель фрейма, который добавляет к нему известное фиксированное смещение переменной (чтобы получить его адрес), а затем вычитает указатель кадра, чтобы найти уже известное фиксированное смещение. Я думаю, что должен быть лучший способ. –
Это очень опасная функция, она совершенно несовместима с оптимизатором. Это действительно нужно MCVE, но длинное представление состоит в том, что вы либо получаете много кода, потому что вы правильно отключили оптимизатор, либо ему нужно много кода, потому что оптимизатор устранил указатель на фрейм. Обязательно выполните компиляцию с -Wframe-адресом. –