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 条评论
登录 后参与评论

相关文章

来自专栏www.96php.cn

PHP关键字、PHP 语言结构(Language constructs)和函数的区别

1、 什么是语言结构和函数 语言结构: 就是PHP语言的关键词,语言语法的一部分; 它不可以被用户定义或者添加到语言扩展或者库中; ...

3519
来自专栏杨龙飞前端

前端命名规范化

1426
来自专栏IMWeb前端团队

react-router实现机制

react-router使用方式 react-router是专为React设计的路由解决方案,以react component的方式提供API,包含常用的Rou...

1996
来自专栏软件开发

JavaScript学习总结(五)——jQuery插件开发与发布

jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非...

653
来自专栏企鹅号快讯

盘点开发者最爱的 IntelliJ 插件 Top 10

关键时刻,第一时间送达! IntelliJ的十大插件?相信每个人都有自己的选择。我们也同样如此。在这里,我们为您带来我们认为的十大IntelliJ插件。 如果你...

1737
来自专栏破晓之歌

python-web.py开发入门(推荐) 原

输入运行文件命令。(我这里pycharm2018.2不晓得为嘛terminal调整不了字间距,而且文件路径的/都变了,文字颜色也不晓得哪里能改,其他地方的显示都...

752
来自专栏嵌入式程序猿

freeRTOS事件组学习

像其他RTOS一样,freeRTOS同样有对事件标志位的创建和处理,在中断中可以通过事件组传递信息给其他的任务,那么如何创建事件组呢? 要使用创建Event的A...

3436
来自专栏Web 开发

WordPress主题修改之Html5语义化

Html5最大的特点在于多媒体和移动互联网方面,小弟不才,对那些了解不多,本次修改仅仅是为了那么一点点语义化。

910
来自专栏互联网开发者交流社区

最新jquery+easyui_api培训文档

924
来自专栏喵了个咪的博客空间

phalcon-入门篇5(请求与返回)

#phalcon-入门篇5(请求与返回)# ? 本教程基于phalcon2.0.9版本 ##前言## 先在这里感谢各位phalcon技术爱好者,我们提供这样一个...

36713

扫码关注云+社区