in the ocean
服务员英文C++符号的还原(demangling)
C++符号
Name Mangling概述
⼤型程序是通过多个模块构建⽽成,模块之间的关系由makefile来描述。对于由C++语⾔编制的⼤型程序⽽⾔,也是符合这
个规则。
程序的构建过程⼀般为:各个源⽂件分别编译,形成⽬标⽂件。多个⽬标⽂件通过链接器形成最终的可执⾏程序。显然,从
某种程度上说,编译器的输出是链接器的输⼊,链接器要对编译器的输出做⼆次加⼯。从通信的⾓度看,这两个程序需要⼀
定的协议来规范符号的组织格式。这就是Name Mangling产⽣的根本原因。
C++的语⾔特性⽐C丰富的多,C++⽀持的函数重载功能是需要Name Mangling技术的最直接的例⼦。对于重载的函数,不
外语能仅依靠函数名称来区分不同的函数,因为C++中重载函数的区分是建⽴在以下规则上的:
函数名字不同 || 参数数量不同||某个参数的类型不同
拉丁美洲人
那么区分函数的时候,应该充分考虑参数数量和参数类型这两种语义信息,这样才能为却分不同的函数保证充分性。
当然,C++还有很多其他的地⽅需要Name Mangling,如namespace, class, template等等。
总的来说,Name Mangling就是⼀种规范编译器和链接器之间⽤于通信的符号表表⽰⽅法的协议,其⽬的在于按照程序的语
⾔规范,使符号具备⾜够多的语义信息以保证链接过程准确⽆误的进⾏。
Swift语⾔由于也有重载的概念,所以也有符号重载机制。
符号还原
1. C++filt
这个命令是linux下的,同时MAC也⽀持,所以在还原iOS中的C++符号,可以直接使⽤这个命令
jins
简单参数说明如下:
NAME
c++filt - Demangle C++ and Java symbols.
SYNOPSIS
c++filt [-_|--strip-underscore]
[-n|--no-strip-underscore]英语在线听力
[-p|--no-params]
[-t|--types]
time files[-i|--no-verbo]
bytheway[-s format|--format=format]
[--help] [--version] []
其中的[-n]⽐较重要,有些的C++符号需要加上这个参数才能还原,⽐如
c++filt -n _ZN5physx2Gu24PCMMeshContactGenerationC2ERKNS_6shdfnd3aos6FloatVES6_RKNS3_12PsTransformVES9_RNS0_33MultiplePersistentContact 结果为:
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]
2. ABI
使⽤linux提供的abi⽂件
#include <cxxabi.h>
std::string CxxDemangle(const char* name) {
etc
char buffer[1024] = {0};
size_t size = sizeof(buffer);
int status;
char *ret;
yipintry {
ret = abi::__cxa_demangle(name, buffer, &size, &status);
if(ret) {
return std::string(ret);
} el {
return name;
}
} catch(...) {
return name;
}
return name;
}
参考:
1. 在线还原⽹站:
2.
3.