Функция класса C++ в сборке
Здравствуйте, сообщество! Я смотрю на ассемблер C++, я скомпилировал эталонный тест из пакета PARSEC, и мне трудно понять, как они называют функции атрибутов класса на ассемблере. например, если у меня есть класс с некоторыми функциями для управления им, в cpp мы называем их как test.increment();
После некоторого расследования я обнаружил, что эта функция
atomic_load_acq_ptr
представлен как:
_ZL19atomic_load_acq_intPVj
в сборке, или, по крайней мере, это то, что я узнал.
Дайте мне знать, если я ошибаюсь! Есть ли какое-то фиксированное правило для сопоставления? или они случайные? Спасибо
4 ответа
Это называется искажение имени, это необходимо из-за перегрузок и шаблонов и тому подобного (то есть простого имени символов и цифр недостаточно для однозначной идентификации фрагмента кода; встраивание пробелов или <>
или же ::
в именах обычно не легально; копирование дополнительной информации в несконденсированной, удобочитаемой форме было бы расточительным), и, следовательно, это зависит от типов, арности и т. д.
Точная схема может варьироваться, но обычно каждый компилятор самосогласован в течение относительно длительного времени (иногда даже несколько компиляторов могут согласиться на один способ).
Это называется искажение имени., Это зависит от компилятора. Нет стандартного способа, извините:)
C++ допускает перегрузку функций, это означает, что можно иметь две функции с одинаковым именем, но разными параметрами. Поскольку ваши двоичные форматы не понимают тип, это проблема. Способ обойти это - использовать схему, называемую искажение имени. Это добавляет целую функцию информации о типе к имени, используемому в исходном файле, и обеспечивает правильную перегрузку.
Добавляемые дополнительные буквы и т. Д. Определяются конкретным используемым двоичным интерфейсом приложения (ABI). Разные компиляторы (а иногда даже разные версии) могут использовать разные ABI.
Да, есть стандартный метод для создания этих символов, известный как искажение имени.