Введение в проблему искажения имен (Name Mangling)
Исследуя скомпилированные ELF-бинарники или разбирая трассировки стека в Linux, инженеры регулярно наталкиваются на криптические текстовые конструкции. Данные строки — результат работы алгоритма name mangling, применяемого транслятором C++ для поддержки полиморфизма, перегрузки функций и иерархий пространств имен. Ниже подробно разобран механизм восстановления исходных определений с помощью стандартной утилиты c++filt, а также ее интеграция в повседневные задачи отладки.
Установка пакета binutils и базовый деманглинг одиночных идентификаторов
Для развертывания утилиты c++filt в дистрибутивах на базе Debian/Ubuntu достаточно инсталлировать базовый набор бинарных инструментов командой apt-get update -qq && apt-get install -y binutils.

Убедиться в наличии исполняемого файла и выяснить текущий релиз утилиты позволяет инструкция c++filt --version | head -n 2.
Программа c++filt транслирует сгенерированные компилятором внутренние метки компоновщика обратно в понятные разработчику сигнатуры функций и классов.
⚙️ [Ключевые параметры запуска]
-_, --strip-underscore : отсекает начальный символ подчеркивания (_) перед началом разбора идентификатора.-n, --no-strip-underscore : запрещает удаление лидирующего подчеркивания в символе.-p, --no-params : подавляет вывод типов аргументов, отображая исключительно имя функции.-t, --types : активирует распознавание встроенных типов данных наряду с сигнатурами функций.-s, --format : принудительно задает схему декодирования под конкретный стандарт ABI компилятора.

Проверить базовую расшифровку тривиального символа можно с помощью команды c++filt _Z1fv.
Инструмент моментально сопоставляет переданную последовательность с определением функции без параметров f().

Для разбора сущностей с областями видимости и типизированными аргументами вызывается c++filt _ZN4Math3addEii.
В результате утилита восстанавливает контекст пространства имен Math, имя метода add и два целочисленных параметра, формируя сигнатуру Math::add(int, int).

Механизм генерации mangled-имен и совместная работа с утилитой nm
Подготовка сборочного тулчейна для компиляции исходников выполняется вызовом apt-get update -qq && apt-get install -y build-essential.

Создадим тестовый исходный файл с перегруженным методом внутри пространства имен командой cat << 'EOF' > /tmp/demo.cpp.

Скомпилируем исходный код в объектный модуль без этапа линковки через g++ -c /tmp/demo.cpp -o /tmp/demo.o.

Анализ таблицы символов на наличие реализаций сложения осуществляется вызовом nm /tmp/demo.o | grep add.
В таблице отчетливо видны закодированные идентификаторы _ZN10Calculator3addEii и _ZN10Calculator3addEdd, в которых компилятор зафиксировал длину имени пространства имен, идентификатор функции и типы аргументов.

Связав вывод таблицы символов с фильтром через стандартный пайплайн nm /tmp/demo.o | c++filt | grep add, получаем мгновенную расшифровку.
Нечитаемые строки трансформируются в прозрачные прототипы Calculator::add(int, int) и Calculator::add(double, double).

Обработка сложных шаблонных инстанциаций через конвейер потоков
Сформируем пример с шаблоном класса, параметризованным вложенным контейнером STL, выполнив cat << 'EOF' > /tmp/template_demo.cpp.

Транслируем шаблонный исходник в объектный файл посредством g++ -c /tmp/template_demo.cpp -o /tmp/template_demo.o.

Извлечем сгенерированные метки функции вывода при помощи nm /tmp/template_demo.o | grep print.
Из-за развертывания шаблонов стандартной библиотеки вывод представляет собой массивную закодированную строку, практически непригодную для ручного разбора.

Перенаправление потока через конвейер командой nm /tmp/template_demo.o | c++filt | grep print возвращает структуру к исходному виду.
Громоздкий идентификатор преобразуется в наглядную декларацию метода класса с раскрытием параметров шаблона Storage<std::vector<std::string>>::print(...).

Фильтрация сигнатур флагом -p и автоматический парсинг журналов ошибок
Вызов утилиты по умолчанию c++filt _ZN10Calculator3addEii демонстрирует полную сигнатуру с перечислением типов входных параметров.
На экран выводится законченная запись Calculator::add(int, int).

Когда требуется скрыть аргументы и оставить только квалифицированное имя сущности, применяется ключ -p: c++filt -p _ZN10Calculator3addEii.
В потоке вывода остается лаконичный путь Calculator::add, что удобно при группировке или генерации кратких сводок.

Для принудительного распознавания типов используется флаг -t: c++filt -t _ZN10Calculator3addEii.
Команда корректно интерпретирует контекст символа и сохраняет целевую сигнатуру Calculator::add(int, int).

Инструмент отлично подходит для обработки текстовых логов с ошибками времени выполнения: echo 'Fatal error in _ZN10Calculator3addEii at runtime' | c++filt.
Программа потоково сканирует входящий текст, вычленяет mangled-подстроки и подменяет их читаемыми сигнатурами без нарушения общей структуры сообщения.

Освоение принципов искажения имен и возможностей инструмента c++filt существенно ускоряет локализацию ошибок компоновщика (undefined reference) и упрощает профилирование бинарных модулей в экосистеме Linux.