C++ 的 Name Mangling

1. 什么是Name Mangling

编程语言组织程序,都有一定的可见范围,比如Java的包、C/C++的文件。就像我们平时使用的文件夹一样,有了这些组织机制,变量、函数的命名在一定程度上就可以重复。

但在程序链接时,这些机制多少都要失效一些,就像每个小朋友在家都叫宝宝,到了幼儿园就没办法通过宝宝来区分彼此了。为了解决名字的唯一性,就需要Name Mangling技术。

其实说白了就是对名字进行重新编码的一种规则。比如使用VIM随便打开一个ELF文件,或是链接时,我们有时候可以看到一些类似与下面这样的古怪字符串:

_ZN9NS_QZSOCK10CTcpClient11SendAndRecvEPciRiRjd

这就是经过Name Mangling处理后的符号。

2. GCC中的Name Mangling

C++的复杂度相对于C肯定是复杂很多的,其中表现之一就是C++的名字管理,比如C++支持重载、支持类、命名空间等。不同的函数可以使用相同的函数名、不同的类可以有相同名字的成员变量。这样C++的Name Mangling就会比C复杂很多。

当然,再复杂的,也都不过是各种Tool Chain的一碟小菜。对于C++的Name Mangling规则,C++标准并没有做具体的规定,但各个编译器平台形成了一些事实性的标准,比如GCC的一个简单规则:

A global object with class or namespace qualifiers is coded as
<public name> ::= _Z <qualified name>
where

<qualified name> ::= N[<simple name> ]E

<simple name> ::= <name length> <name>

就是一个类的成员函数可能会被Name Mangling编码为:_Z+N+长度+名字+E

3. GNU Binutils中Name De-Mangling的相关工具

GNU Binutils工具集中提供了Name De-Mangling相关的工具,最典型的c++filt和nm,使用举例如下:

c++filt _ZN9NS_QZSOCK10CTcpClient11SendAndRecvEPciRiRjd
NS_QZSOCK::CTcpClient::SendAndRecv(char*, int, int&, unsigned int&, double)

nm -C bin/play_url.so | grep SendAndRecv
0000000000391090 T NS_QZSOCK::CTcpClient::SendAndRecv(char*, int, int&, unsigned int&, double)
0000000000390a10 T NS_QZSOCK::CUdpClient::SendAndRecv(char*, int, int&, unsigned int&, double)

有了这些工具,再也不怕链接报错和二进制分析时看到的一些奇怪符号了。

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏fangyangcoder

tensorflow笔记(一)之基础知识

http://www.cnblogs.com/fydeblog/p/7399701.html

622
来自专栏目标检测和深度学习

深度学习工程模板:简化加载数据、构建网络、训练模型和预测样本的流程

注意:支持在训练中调用callbacks,额外添加模型存储、TensorBoard、FPR度量等。

844
来自专栏机器之心

快速开启你的第一个项目:TensorFlow项目架构模板

2687
来自专栏漫漫深度学习路

tensorflow学习笔记(三十一):构建多GPU代码

构建多GPU代码 结构 先构建单GPU代码 写个函数multi_gpu_model(num_gpus)来生成多GPU代码,并将对象保存在collection中 ...

2327
来自专栏深度学习那些事儿

pytorch中retain_graph参数的作用

在pytorch神经网络迁移的官方教程中有这样一个损失层函数(具体看这里提供0.3.0版中文链接:https://oldpan.me/archives/pyto...

3034
来自专栏Python小屋

Python文本处理2个小案例(文本嗅探与关键词占比统计)

问题描述:有一些句子和一些关键词,现在想找出包含至少一个关键词的那些句子(文本嗅探),可以参考print('='*30)之前的代码。如果想进一步计算每个句子中的...

33511
来自专栏苦逼的码农

每日一题1:回文整数

分析:有人可能会把它转化为字符串,然后在来逐一比较,显然这在处理速度上是比较慢的。下面是我推荐的两种做法:

693
来自专栏程序生活

斯坦福tensorflow教程(二) tensorflow相关运算1.认识下TensorBoard2.常量op3. 数学运算数据类型

2076
来自专栏mathor

枚举+优化(5)——双指针优化1

1183
来自专栏Deep Learning 笔记

图像识别(三)cifar10.py

tf.app.flags.DEFINE_integer()等函数是添加了命令行的可选参数

324

扫码关注云+社区