本文共 1901 字,大约阅读时间需要 6 分钟。
Name Mangling概述
大型程序是通过多个模块构建而成,模块之间的关系由makefile来描述。对于由C++语言编制的大型程序而言,也是符合这个规则。
程序的构建过程一般为:各个源文件分别编译,形成目标文件。多个目标文件通过链接器形成最终的可执行程序。显然,从某种程度上说,编译器的输出是链接器的输入,链接器要对编译器的输出做二次加工。从通信的角度看,这两个程序需要一定的协议来规范符号的组织格式。这就是Name Mangling产生的根本原因。
C++的语言特性比C丰富的多,C++支持的函数重载功能是需要Name Mangling技术的最直接的例子。对于重载的函数,不能仅依靠函数名称来区分不同的函数,因为C++中重载函数的区分是建立在以下规则上的:
函数名字不同 || 参数数量不同||某个参数的类型不同
那么区分函数的时候,应该充分考虑参数数量和参数类型这两种语义信息,这样才能为却分不同的函数保证充分性。
当然,C++还有很多其他的地方需要Name Mangling,如namespace, class, template等等。
总的来说,Name Mangling就是一种规范编译器和链接器之间用于通信的符号表表示方法的协议,其目的在于按照程序的语言规范,使符号具备足够多的语义信息以保证链接过程准确无误的进行。
Swift语言由于也有重载的概念,所以也有符号重载机制。
这个命令是linux下的,同时MAC也支持,所以在还原iOS中的C++符号,可以直接使用这个命令
简单参数说明如下:
其中的[-n]比较重要,有些的C++符号需要加上这个参数才能还原,比如
c++filt -n _ZN5physx2Gu24PCMMeshContactGenerationC2ERKNS_6shdfnd3aos6FloatVES6_RKNS3_12PsTransformVES9_RNS0_33MultiplePersistentContactManifoldERNS0_13ContactBufferE结果为:
physx::Gu::PCMMeshContactGeneration::PCMMeshContactGeneration(physx::shdfnd::aos::FloatV const&, physx::shdfnd::aos::FloatV const&, physx::shdfnd::aos::PsTransformV const&, physx::shdfnd::aos::PsTransformV const&, physx::Gu::MultiplePersistentContactManifold&, physx::Gu::ContactBuffer&)
如果不加[-n]就无法解析;有些C++符号的解析,则不需要添加[-n]
使用linux提供的abi文件
#includestd::string CxxDemangle(const char* name) { char buffer[1024] = {0}; size_t size = sizeof(buffer); int status; char *ret; try { ret = abi::__cxa_demangle(name, buffer, &size, &status); if(ret) { return std::string(ret); } else { return name; } } catch(...) { return name; } return name;}
参考:
1. 在线还原网站:
2.
3.
转载地址:http://rpvsi.baihongyu.com/