如何识别C++编译以后的函数名(demangle)
2017-10-09 11:08
344 查看
C/C++语言在编译以后,函数的名字会被编译器修改,改成编译器内部的名字,这个名字会在链接的时候用到。如果用backtrace之类的函数打印堆栈时,显示的就是被编译器修改过的名字,比如说_Z3foov 。 那么这个函数真实的名字是什么呢?
每个编译器都有一套自己内部的名字,这里只是针对linux下g++而言。
以下是基本的方法:
每个方法都是以_Z开头,对于嵌套的名字(比如名字空间中的名字或者是类中间的名字,比如Class::Func)后面紧跟N , 然后是各个名字空间和类的名字,每个名字前是名字字符的长度,再以E结尾。(如果不是嵌套名字则不需要以E结尾)
比如上面的_Z3foov 就是函数foo() , v 表示参数类型为void .
又如N:C:Func 经过修饰后就是 _ZN1N1C4FuncE, 这个函数名后面跟参数类型。 如果跟一个整型,那就是_ZN1N1C4FuncEi
另外在linux下有一个工具可以实现这种转换,这个工具是c++filt , 注意不是c++filter.
如何识别C++编译以后的函数名(demangle)
From : http://www.bagualu.net/wordpress/archives/2312C/C++语言在编译以后,函数的名字会被编译器修改,改成编译器内部的名字,这个名字会在链接的时候用到。如果用backtrace之类的函数打印堆栈时,显示的就是被编译器修改过的名字,比如说_Z3foov 。 那么这个函数真实的名字是什么呢?
每个编译器都有一套自己内部的名字,这里只是针对linux下g++而言。
以下是基本的方法:
每个方法都是以_Z开头,对于嵌套的名字(比如名字空间中的名字或者是类中间的名字,比如Class::Func)后面紧跟N , 然后是各个名字空间和类的名字,每个名字前是名字字符的长度,再以E结尾。(如果不是嵌套名字则不需要以E结尾)
比如上面的_Z3foov 就是函数foo() , v 表示参数类型为void .
又如N:C:Func 经过修饰后就是 _ZN1N1C4FuncE, 这个函数名后面跟参数类型。 如果跟一个整型,那就是_ZN1N1C4FuncEi
另外在linux下有一个工具可以实现这种转换,这个工具是c++filt , 注意不是c++filter.
xuyang@ubuntu15:~/blog$ c++filt _ZN1N1C4FuncEi N::C::Func(int)
相关文章推荐
- 如何识别C++编译以后的函数名(demangle)
- c++ 编译时函数匹配和运行时类型识别
- 如何实现虚函数的规则(VC中 C++ virtual 编译规则)
- 抱歉,没分了!!!请教linux下,用C/C++编程,如何知道我要实现某一功能需要用到什么函数
- C++的多态如何在编译和运行期实现
- 如何把C++成员函数的地址传给C
- 如何混合编译C语言和C++
- C++学习笔记之函数如何返回字符串(char型)
- C++ 中Template 类、函数的编译过程
- JNI引用C++dll若干问题总结-如何导出C++中的类成员函数
- 如何解决“不是可以识别的 函数名“的问题
- C++如何使用时间函数(1)
- 如何禁止C++默认生成成员函数
- C++函数不写bool返回值,居然编译运行全部通过,但判断结果就不对了
- c++里的system()函数调用系统命令如何获取打印信息
- C/C++如何使用密码输入而不回显--getch()函数
- Linux下C/C++编译链接过程及库函数使用说明
- Visual Studio 2005中如何编译和运行C++程序【转载】
- c++函数如何返回多值,返回数组的函数该如何调用
- 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”?