去修饰的 C++ 符号的歧义
Ambiguity of de-mangled C++ symbols
_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
在内的"complete object constructor"是普通构造函数,直接用于初始化
- "base object constructor" 包括
C2
被派生的 class 构造函数用来初始化其基础 class 子对象。当涉及虚拟继承时,这可能与 "complete" 构造函数不同,因为只有完整的构造函数会初始化虚拟基,而基构造函数会假设它们的虚拟基已经被初始化。
- 包含
C3
的 "complete object allocating constructor" 可能包含对 operator new
的调用。但据我所知,g++ 从未真正使用过这个。
- 包括
D0
在内的 "deleting destructor" 以调用适当的标量 operator delete
结束。这是绑定到虚拟析构函数所必需的,因为正确的 operator delete
可能是一个静态 class 成员,基础 class 对此一无所知。
- 包含
D1
的 "complete object destructor" 类似于 C1
构造函数的逆向,包括对虚基 classes. 的析构函数的调用
- "base object destructor" 包括
D2
就像 C2
构造函数的反转,省略了对虚基 classes. 的析构函数的调用
因此,您询问的 C1
和 C2
部分损坏的名称暗示对 C++ 系统很重要的信息,必须单独正确链接。但是该信息很难在伪代码声明中进行简要解释,因此 demangling 函数只是对两个符号进行相同的描述。
尽管由于 std::allocator<T>
通常没有任何虚拟基 classes,这两个符号很可能实际上指向相同的代码地址,但 g++ 只是提供了两个链接器符号以保持一致性。
_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
在内的"complete object constructor"是普通构造函数,直接用于初始化 - "base object constructor" 包括
C2
被派生的 class 构造函数用来初始化其基础 class 子对象。当涉及虚拟继承时,这可能与 "complete" 构造函数不同,因为只有完整的构造函数会初始化虚拟基,而基构造函数会假设它们的虚拟基已经被初始化。 - 包含
C3
的 "complete object allocating constructor" 可能包含对operator new
的调用。但据我所知,g++ 从未真正使用过这个。 - 包括
D0
在内的 "deleting destructor" 以调用适当的标量operator delete
结束。这是绑定到虚拟析构函数所必需的,因为正确的operator delete
可能是一个静态 class 成员,基础 class 对此一无所知。 - 包含
D1
的 "complete object destructor" 类似于C1
构造函数的逆向,包括对虚基 classes. 的析构函数的调用
- "base object destructor" 包括
D2
就像C2
构造函数的反转,省略了对虚基 classes. 的析构函数的调用
因此,您询问的 C1
和 C2
部分损坏的名称暗示对 C++ 系统很重要的信息,必须单独正确链接。但是该信息很难在伪代码声明中进行简要解释,因此 demangling 函数只是对两个符号进行相同的描述。
尽管由于 std::allocator<T>
通常没有任何虚拟基 classes,这两个符号很可能实际上指向相同的代码地址,但 g++ 只是提供了两个链接器符号以保持一致性。