C++符号的还原(demangling)

本文介绍C++ NameMangling的基本概念及其在程序构建过程中的作用,详细讲解了如何利用c++filt命令和ABI文件进行符号还原,并提供了具体实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 <cxxabi.h>  
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. 在线还原网站:  GCC and MSVC C++ Demangler

2. C++filt用户命令

3. ABI Demangling

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值