一、导读

Name Mangling(名称修饰)是编译器用来向具有相同名称的函数添加附加字符(函数重载)的一种机制。名称修改的目的是避免在执行程序和调用可能与另一个函数同名的函数时出现任何混淆。

二、含义解读

为了更好地理解这个概念,这里有两个重要的维基百科定义:

函数重载:

在某些编程语言中,函数重载或方法重载是创建具有不同实现的多个同名函数的能力。对重载函数的调用将运行适合于调用上下文的该函数的特定实现,允许一个函数调用根据上下文执行不同的任务。

Name Mangling:

在编译器构造中,name mangling(也称为名称修饰)是一种用于解决由于需要为许多现代编程语言中的编程实体解析唯一名称而引起的各种问题的技术。它提供了一种以函数、结构、类或其他数据类型的名称对附加信息进行编码的方法,以便将更多语义信息从编译器传递给linker

三、Name Mangling Example

现在我们对名称修饰的工作原理以及它是什么有了更多的了解。让我们举个例子。

#include <iostream>
using namespace std;
void add(int a, int b){cout << a + b << endl;}
void add(double a, double b){cout << a + b << endl;}
int main()
{add(1, 2);add(5.5, 8.3);return 0;
}

在上面的示例中,我们创建了两个具有相同名称“add”的函数。为避免混淆,编译器将修改这两个函数。可以使用“nm”命令查看它们。

$nm bin/Debug/mangle.exe
0047add0 t .text$_ZNSiD0Ev
004add30 t .text$_ZNSt8numpunctIcEC1Ej
004addd0 t .text$_ZNSt8numpunctIcEC2EPSt16__numpunct_cacheIcEj
004afd30 t .text$_ZSt14__add_groupingIcEPT_S1_S0_PKcjPKS0_S5_
004afea0 t .text$_ZSt14__add_groupingIwEPT_S1_S0_PKcjPKS0_S5_
0040147e t __GLOBAL__sub_I__Z3addii

00401382 T __Z3adddd
00401350 T __Z3addii

0047add0 T __ZNSiD0Ev
004186c0 T __ZNSt15__exception_ptr13exception_ptr9_M_addrefEv
004add30 T __ZNSt8numpunctIcEC1Ej
004addd0 T __ZNSt8numpunctIcEC2EPSt16__numpunct_cacheIcEj
004afd30 T __ZSt14__add_groupingIcEPT_S1_S0_PKcjPKS0_S5_
004afea0 T __ZSt14__add_groupingIwEPT_S1_S0_PKcjPKS0_S5_
004271d0 T ____w64_mingwthr_add_key_dtor
0042ef60 T ___multadd_D2A
004352d0 T _pthread_attr_getstackaddr
004352e0 T _pthread_attr_setstackaddr

为清楚起见,我截断了输出并将我们的两个“add”函数加粗。

四、命名规则

五、Example 剖析

在我们的示例中,我们使用了 GCC 编译器。为了理解我们的错位函数,让我们剖析它们:

void add(int a, int b) become __Z3adddd
void add(double a, double b) become __Z3addii
  • 损坏的名称以 _Z 开头
  • 数字 3 是函数名称的长度(“add” = 3 个字符)。
  • 最后,字母“dd”和“ii”是我们函数中使用的变量类型。

显然有更复杂的名称,具体取决于它在二进制文件中使用的变量类型和数据结构。

此外,网站 https://demangler.com/ 也可以帮助您了解损坏的名称。

或者,您也可以使用工具“c++filt”或二进制文件中的“nm -C”来对函数名称进行分解:

$ c++filt -_ __Z3adddd# "-_" to ignore the first underscoreadd(double, double)

Name Mangling相关推荐

  1. C++ name mangling

    name mangling在wiki上的定义:它提供了在函数.结构体.类或其它的数据类型的名字中编码附加信息一种方法,用于从编译器中向链接器传递更多语义信息. 简单来说就是在编译阶段将函数名进行转换, ...

  2. 名称的特殊处理(Name Mangling)

    先说一个事情, mangle 的意思是 vt.乱砍, 损坏; n. 碾压机. 这意味着 name mangling 就是要先把你精心想出的名字们碾碎, 再拼成独一无二的样子, 当然这么残忍的事情都是编 ...

  3. 一叶知秋:“安全“的野指针、 static函数、成员函数、this 指针、gcc编译器、name mangling

    <span style="font-size:18px;">我们从实验中去总结问题 测试一: virtual 函数和non-virtual函数 01.#include  ...

  4. [C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++

    http://www.geeksforgeeks.org/extern-c-in-c/ C++函数重载(function overloading),但是C++编译器是如何区分不同的函数的呢?----是 ...

  5. 一叶知秋:“安全“的野指针、 static函数、成员函数、this 指针、gcc编译器、name mangling...

    <span style="font-size:18px;">我们从实验中去总结问题 测试一: virtual 函数和non-virtual函数 01.#include  ...

  6. rpmbuild告警mangling shebang in xxx from /bin/python to /usr/bin/python/python2.

    rpmbuild告警mangling shebang in xxx from #!/bin/python to #!/usr/bin/python/python2. This will become ...

  7. 电脑粉碎文件 c语言,C/C++ 编译器的命名粉碎规则(name mangling)和C/C++混合(ZZ)

    http://hi.baidu.com 在面向对象编程语言出现之前,如果你想要打印不同类型的数据,需要写多个方法 ,象是PrintInteger(int i),PrintString(string s ...

  8. 解析VC++ Name Mangling 机制

    摘要 在C++中,Name Mangling 是为了支持重载而加入的一项技术,目前C++ Name Mangling 并没有统一的标准,也没有较完整的中文文档化资料,所以本篇文章在VS2005环境中, ...

  9. 三段式LLVM编译器

    三段式LLVM编译器 目录 概述 LLVM技术生态之编译器 一.传统编译器的设计 二.传统编译器模式的实现 三.LLVM的三段式实现 四.LLVM's Code Representation:LLVM ...

最新文章

  1. Linux shell编程(四)流程控制
  2. Unity 2D游戏开发教程之使用脚本实现游戏逻辑
  3. 提高页面显示速度的秘技
  4. vbs打开软件光标停在第一个输入框_三维设计软件,3DMAX最全快捷键大全,赶快收藏哦...
  5. 计算机考研专业基础知识视频教程链接
  6. 路由器信号总是无法与手机连接服务器,手机无法搜到路由器信号怎么办? | 192路由网...
  7. 外贸建站前必做的SEO优化?
  8. VMWare 虚拟机工作站 + Ubuntu操作系统安装
  9. Linux 按行分割文件(转载)
  10. shell 字符串中是否包含任一字符串
  11. 1024公众号福利放送
  12. 管家婆软件二次开发(在管家婆财贸双全中实现建行支付)
  13. 排列型枚举(座次问题)
  14. 十五、Events类
  15. angular 部署的项目自定义访问路径,不使用root根目录的配置
  16. 一年前,月薪两万被人叫老总,如今35岁在美团送外卖
  17. Technical Artist的不归路 —— 创建游戏世界前团队交流之我见
  18. 你想要的宏基因组-微生物组知识全在这(180901)
  19. Python词法分析器实现
  20. 计算机综述性论文范文例文,综述性论文范文

热门文章

  1. Dev-C++ 的下载、安装和配置
  2. Consul Sessions
  3. 【SQL注入】手工注入常用语句合集
  4. supersqli(SQL注入流程及常用SQL语句)
  5. 跨专业考清华大学的计算机,18级学长跨考清华大学计算机考研经验分享
  6. WDK学习笔记_基于区块链溯源系统的后端接口开发
  7. java数据结构--TreeSet
  8. php程序员如何写简历
  9. 进程与程序的区别与联系
  10. php编程里的push,【编程词典】php array_push()函数