在 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

(编辑 - 添加一些上下文)

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++ 名称修改的发现。