专栏首页遊俠扎彪C++ 的 Name Mangling
原创

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

相关文章

  • 软件的版本标志

    本文最早发表于2008-10-07,传统软件发布中,关于版本号中的一些术语。 Trial:试用版,软件在功能或时间上有所限制,如果想解除限制,需要购买零售版。 ...

    雷大亨
  • Linux操作系统中删除ARP缓存的命令

    在Windows下,使用比较多的两个操作ARP缓存的命令是arp -a和arp -d,前者是查看所有ARP条目,后者是删除所有ARP条目。

    雷大亨
  • CentOS 5.6 安装 Oracle 10g 基本步骤

    尝试安装了不下10次,只成功两次,很奇怪。安装Oracle是我接触Linux以来,最糟糕的经历之一。现总结一下,主要参考列表如下:

    雷大亨
  • PHP使用GD库生成文件

    用户7657330
  • 小朋友学Java(7):继承

    在学习Java的继承之前,可以先复习一下C++的继承: http://www.jianshu.com/p/bc9b7ddb141c 一、定义 继承就是子类(派生...

    海天一树
  • 机器学习高斯混合模型(后篇):GMM求解完整代码实现

    《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来...

    double
  • 数据库风云五十载:老骥伏枥,新秀迭起!

    “在数据库技术方面,亚马逊落后甲骨文10至20年”。2018年10月23日,甲骨文(Oracle)创始人、执行董事长拉里·埃里森,在甲骨文举办的一次大会的主题演...

    AI科技大本营
  • java基础学习_面向对象(下)02_day09总结

    ============================================================================= ==...

    黑泽君
  • Oracle和Mysql获取uuid的方法对比

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    SmileNicky
  • 【数据科学】揭秘硅谷数据工程师求职

    导言 大数据工程师是如今最火的职业,没有之一。也可能是未来十年最火的职位。那么对于如此新型的职业和技术,留学生朋友们应该如何求职?硅谷大数据达人,董老师为你揭秘...

    陆勤_数据人网

扫码关注云+社区

领取腾讯云代金券