在 Linux 上修改 C++ 名称时什么算作符号?
What counts as a symbol while mangling C++ names on Linux?
在 Linux g++/clang++
void test10058l(void*(*)(void*),void*(*)(const void*),const void*(*)(void*));
被损坏为 _Z10test10058lPFPvS_EPFS_PKvEPFS3_S_E
- 根据g++/clang++,这个函数定义中有多少个符号?
- 有哪些替代品? (
S_
, S0_
, S1_
, ...)
- 更具体地说,
S3_
是什么?
(编辑 - 添加一些上下文)
D language allows to interact with C++通过声明符号为extern(C++)
.
不幸的是,当前的实现并不总是正确的 - 我正在尝试通过实现当前的 g++/clang++ 名称修改方案来修复它 as defined by the Itanium C++ ABI。
由于此文档不crystal 清楚,我很难理解什么是符号。
函数重整依赖于编译器activity,没有标准的方向。您可以使用以下工具来分解 http://demangler.com/
经过几次实验,我终于明白了符号是如何被替换的。特别是,限定类型会创建新的符号并自行解释符号的功能。指向函数的指针就是另一个符号。
这是我提供的示例的替换细目。
void test10058l(void*(*)(void*),void*(*)(const void*),const void*(*)(void*));
_Z10test10058lPFPvS_EPFS_PKvEPFS3_S_E
S_ ^^ : Pv void*
S0_ ^^^^^^ : FPvS_E void*()(void*)
S1_ ^^^^^^^ : PFPvS_E void*(*)(void*)
S2_ ^^ : Kv const void
S3_ ^^^ : PKv const void*
S4_ ^^^^^^^ : FS_PKvE void*()(const void*)
S5_ ^^^^^^^^ : PFS_PKvE void*(*)(const void*)
S6_ ^^^^^^^ : FS3_S_E const void*()(void*)
S7_ ^^^^^^^^ : PFS3_S_E const void*(*)(void*)
我开始这个 git repository 是为了报告我关于 linux/osx GCC C++ 名称修改的发现。
在 Linux g++/clang++
void test10058l(void*(*)(void*),void*(*)(const void*),const void*(*)(void*));
被损坏为 _Z10test10058lPFPvS_EPFS_PKvEPFS3_S_E
- 根据g++/clang++,这个函数定义中有多少个符号?
- 有哪些替代品? (
S_
,S0_
,S1_
, ...) - 更具体地说,
S3_
是什么?
(编辑 - 添加一些上下文)
D language allows to interact with C++通过声明符号为extern(C++)
.
不幸的是,当前的实现并不总是正确的 - 我正在尝试通过实现当前的 g++/clang++ 名称修改方案来修复它 as defined by the Itanium C++ ABI。
由于此文档不crystal 清楚,我很难理解什么是符号。
函数重整依赖于编译器activity,没有标准的方向。您可以使用以下工具来分解 http://demangler.com/
经过几次实验,我终于明白了符号是如何被替换的。特别是,限定类型会创建新的符号并自行解释符号的功能。指向函数的指针就是另一个符号。
这是我提供的示例的替换细目。
void test10058l(void*(*)(void*),void*(*)(const void*),const void*(*)(void*));
_Z10test10058lPFPvS_EPFS_PKvEPFS3_S_E
S_ ^^ : Pv void*
S0_ ^^^^^^ : FPvS_E void*()(void*)
S1_ ^^^^^^^ : PFPvS_E void*(*)(void*)
S2_ ^^ : Kv const void
S3_ ^^^ : PKv const void*
S4_ ^^^^^^^ : FS_PKvE void*()(const void*)
S5_ ^^^^^^^^ : PFS_PKvE void*(*)(const void*)
S6_ ^^^^^^^ : FS3_S_E const void*()(void*)
S7_ ^^^^^^^^ : PFS3_S_E const void*(*)(void*)
我开始这个 git repository 是为了报告我关于 linux/osx GCC C++ 名称修改的发现。