Преобразование сигнатуры функции из языка компилятора в c ++ - PullRequest
2 голосов
/ 30 ноября 2010

Эй, ребята, мне нужно составить список некоторых функций, которые перечислены в выводе компоновщика. Синтаксис, который я получаю, выглядит следующим образом:

int foo(int num,double dnum, Temp & temp) (in namespace "funcsns")

Превращается в:

.text._ZN7funcsns3fooEidRNS_4TempE

(Вы можете знать это по «неопределенному символу» и некоторым другим ошибкам связывания, которые печатают имена функций)

Теперь я могу написать скрипт, который каким-то образом превращает его во что-то читаемое, но мне интересно, есть ли умный способ сделать это.

Пожалуйста, поделитесь своими идеями!
спасибо.

Ответы [ 4 ]

7 голосов
/ 30 ноября 2010

В системе, использующей набор инструментов GNU, программа c++filt делает именно то, что вы ищете.Это часть пакета "binutils".Не знаю о других системах.

".text."не является частью искалеченного имени.Запуск c++filt _ZN7funcsns3fooEidRNS_4TempE дает funcsns::foo(int, double, funcsns::Temp&).

3 голосов
/ 30 ноября 2010

Это называется украшением или калечением имени.Вот некоторая информация о том, как это работает для различных компиляторов

http://www.kegel.com/mangle.html

2 голосов
/ 30 ноября 2010

Как указано другими, c++filt - это путь для цепочки инструментов GNU.

Это также можно сделать программно (даже из программы на C): см. abi::__cxa_demangle (что на самом деле делает c++filt).

1 голос
/ 30 ноября 2010

Утилита undname, поставляемая с Visual Studio (по крайней мере, VC2005, который я сейчас использую), выполняет те же функции, что и C ++ Filter для Microsoft Visual C ++

.
...