c++filt

作者: 猿佑 | 来源:发表于2019-02-23 10:05 被阅读0次

    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。

    相关文章

      网友评论

          本文标题:c++filt

          本文链接:https://www.haomeiwen.com/subject/tgmuyqtx.html