c++ demangle工具。
有时候,我们的c++/c程序,在编译的时候不会报错,但是在运行的时候会报dlopen失败。此时多数是因为动态库的路径找不到。其实我们完全没有必要等到运行的时候才去发现此问题,我们可以通过ldd -r 命令(执行数据对象和函数的重定位,并且报告任何丢失的对象和函数)来找出undefined函数名,比如用ldd -r test.so查出缺少_ZNK4Json5ValueixEPKc。我们可以用c++filt来还原函数名。
c++filt _ZNK4Json5ValueixEPKc
Json::Value::operator[](char const*) const
参数
c++filt --help
Usage: c++filt [options] [mangled names]
Options are:
[-_|--strip-underscore] Ignore first leading underscore
[-n|--no-strip-underscore] Do not ignore a leading underscore (default)
[-p|--no-params] Do not display function arguments
[-i|--no-verbose] Do not show implementation details (if any)
[-t|--types] Also attempt to demangle type encodings
[-s|--format {none,auto,gnu,lucid,arm,hp,edg,gnu-v3,java,gnat,dlang}]
[@<file>] Read extra options from <file>
[-h|--help] Display this information
[-v|--version] Show the version information
每个编译器都有一套自己内部的名字,比如对于linux下g++而言。以下是基本的方法:
每个方法都是以_Z开头,对于嵌套的名字(比如名字空间中的名字或者是类中间的名字,比如Class::Func)后面紧跟N , 然后是各个名字空间和类的名字,每个名字前是名字字符的长度,再以E结尾。(如果不是嵌套名字则不需要以E结尾)。
比如对于_Z3foov 就是函数foo() , v 表示参数类型为void。又如N:C:Func 经过修饰后就是 _ZN1N1C4FuncE,这个函数名后面跟参数类型。 如果跟一个整型,那就是_ZN1N1C4FuncEi。
网友评论