博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++符号的还原(demangling)
阅读量:4109 次
发布时间:2019-05-25

本文共 1901 字,大约阅读时间需要 6 分钟。

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++符号,可以直接使用这个命令

简单参数说明如下:

NAME     c++filt - Demangle C++ and Java symbols.SYNOPSIS     c++filt [-_|--strip-underscore]             [-n|--no-strip-underscore]             [-p|--no-params]             [-t|--types]             [-i|--no-verbose]             [-s format|--format=format]             [--help]  [--version]  [symbol...]

其中的[-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]

2. ABI

使用linux提供的abi文件

#include 
std::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/

你可能感兴趣的文章
Java的时间操作玩法实例若干
查看>>
JavaScript:时间日期格式验证大全
查看>>
(python版)《剑指Offer》JZ01:二维数组中的查找
查看>>
(python版)《剑指Offer》JZ28:数组中出现次数超过一半的数字
查看>>
(python版)《剑指Offer》JZ30:连续子数组的最大和
查看>>
(python版)《剑指Offer》JZ02:替换空格
查看>>
管理用户状态——Cookie与Session
查看>>
通过Spring Boot三分钟创建Spring Web项目
查看>>
Java编程基础:static的用法
查看>>
Java编程基础:抽象类和接口
查看>>
Java编程基础:异常处理
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
Spring处理表单提交
查看>>
Spring MVC异常处理
查看>>
PHP 7 的五大新特性
查看>>
PHP底层的运行机制与原理
查看>>
深入了解php底层机制
查看>>
PHP中的stdClass 【转】
查看>>
XHProf-php轻量级的性能分析工具
查看>>
PHP7新特性 What will be in PHP 7/PHPNG
查看>>