c++ - 去修饰的 C++ 符号的歧义

标签 c++ gcc demangler

_ZNSaIwEC1Ev
_ZNSaIwEC2Ev

这两个 C++ 符号不同但被分解(使用 C++filt 或类似实用程序)为相同的形式:

std::allocator<wchar_t>::allocator()
std::allocator<wchar_t>::allocator()

为什么会这样?可能是解码器的缺陷还是其他原因?

最佳答案

g++ 使用由 Itanium ABI 指定的名称修改方案(和其他实现细节) .

在关于 mangling of constructors and destructors 的部分,我们看到:

<ctor-dtor-name> ::= C1 # complete object constructor
                 ::= C2 # base object constructor
                 ::= C3 # complete object allocating constructor
                 ::= D0 # deleting destructor
                 ::= D1 # complete object destructor
                 ::= D2 # base object destructor
  • “完整的对象构造函数”包括C1是初始化直接使用的普通构造函数。
  • “基本对象构造函数”包括C2派生类构造函数使用它来初始化其基类子对象。当涉及虚拟继承时,这可能不同于“完整”构造函数,因为只有完整构造函数会初始化虚拟基类,而基类构造函数会假设它们的虚拟基类已经被初始化。
  • “完整的对象分配构造函数”包括C3大概包括对 operator new 的调用.但据我所知,g++ 从未真正使用过这个。
  • “删除析构函数”包括D0最后调用适当的标量 operator delete .这是绑定(bind)到虚拟析构函数所必需的,因为正确的 operator delete可能是基类一无所知的静态类成员。
  • “完整的对象析构函数”包括D1就像 C1 的反面构造函数,并包括对虚拟基类的析构函数的调用。
  • “基本对象析构函数”包括D2就像 C2 的反面构造函数,并省略对虚拟基类的析构函数的调用。

所以 C1C2您询问的一些损坏的名称暗示了对 C++ 系统很重要的信息,必须单独正确链接。但该信息很难在伪代码声明中进行简要解释,因此 demangling 函数只是对两个符号进行相同的描述。

尽管自 std::allocator<T>通常没有任何虚拟基类,这两个符号很可能实际上指向相同的代码地址,但 g++ 只是提供了两个链接器符号以保持一致性。

关于c++ - 去修饰的 C++ 符号的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49824915/

相关文章:

模板化单例的 C++ 工厂

c++ - header 多重重新定义

c++ - 编译错误 : cpumask. h: "and"可能不会出现在宏参数列表中

c++ - 静态内存使用的层次概述

linux - 当我将编译器从 GCC 3.4.2 切换到 GCC 4.4.2 或 ICC 时需要注意什么?

c++ - abi::__cxa_demangle -- 为什么缓冲区需要 `malloc` -ed?

c++ - 什么是用于破坏 C++ 符号名称的 Linux 实用程序?

c++ - 获取平面的角点

c++ - 如何在 MFC C++ 中开始使用线程编程?

c++ - Visual Studio 上的 boost::core::demangle typeid().name