在Linux上混淆c++名称时,什么算符号?

What counts as a symbol while mangling C++ names on Linux?

本文关键字:什么 符号 Linux c++      更新时间:2023-10-16

Linux下g++/clang++

void test10058l(void*(*)(void*),void*(*)(const void*),const void*(*)(void*));

被修改为_Z10test10058lPFPvS_EPFS_PKvEPFS3_S_E

  • 根据g++/clang++,这个函数定义中有多少个符号?
  • 有哪些替代?( S_, S0_, S1_,…)
  • 什么是S3_ ?

(edit -添加一些上下文)

D语言允许通过将符号声明为extern(C++)来与c++交互。

不幸的是,当前的实现并不总是正确的-我试图通过实现Itanium c++ ABI定义的当前g++/clang++名称mangling方案来修复它。

由于这个文档不是很清楚,我很难理解什么是一个符号

经过几次实验,我终于理解了符号是如何被替换的。特别地,限定类型创建新的符号,函数自己解释符号。指向函数的指针则是另一个符号。

下面是我提供的示例的替换的细目。

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存储库是为了报告我关于linux/osx GCC c++名称混淆的发现。

函数篡改是依赖于编译器的活动,没有标准的方向。您可以使用以下工具修改http://demangler.com/